二进制文件转文本文件的实现

本文介绍了一种将二进制文件转换为文本的方法,并提供了一个C++实现示例。该程序能够读取特定格式的二进制文件并将其转换为对应的ASCII文本。

 /*
说明:程序只能处理不带回车/换行的二进制文件。

[bina.txt]内容如下:
----------------------------------------------------------------------
010010010010000001100101011011100110101001101111011110010110010101100100001000000110001101101111011001000110100101101110011001110010000001110100011010000110100101110011001000000111010001101111011011110110110000101100001000000100100100100000011010000110111101110000011001010010000001111001011011110111010100100000011000010111001001100101001000000110010101101110011010100110111101111001011010010110111001100111001000000111010001101000011010010111001100100000011000100111100100100000011101010111001101101001011011100110011100100000011010010111010000101110000011010000101001001100011010010111011001100101010100000110100001111001011100110110100101100011011100110010111001000011011011110110110100001101000010100100010001100101011101100110010101101100011011110111000001100101011100100010000001010100011001010110000101101101
----------------------------------------------------------------------

转换出来的[text.txt]内容如下:
----------------------------------------------------------------------
I enjoyed coding this tool, I hope you are enjoying this by using it.

LivePhysics.Com
 
Developer Teamm
----------------------------------------------------------------------

*/

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string>

using namespace std;
#define NSIZE  8                            // 每次读取字符数目为8(正好是一个字符)

void main()
{
 ifstream ifile;
 ofstream ofile; 

 int i = 0, j = 0, iTemp = 0;

 int ibina[NSIZE];       // 存放二进制字节流
 char cRead[NSIZE];              // 存储读文件流的数据
 char cChar;                  // 存放由二进制还原的字符

 ifile.open("bina.txt", ios::in | ios::binary);
 ofile.open("text.txt");

 if (!ifile)
 {
  cout << "cannot open file/n";
  return;
 }

    while(!ifile.eof())
    {
  ifile.read(cRead, NSIZE);

  // 将字符转换为0101形式后存入整型数组
  for(i = 0; i < NSIZE; i++)
  {
   ibina[i] = (cRead[i] - '0');    // 减'0'才能保存为0101形式,否则会保存为ASCII码形式
  }

  // 每8位为一个字节进行还原
  iTemp = 1;
  cChar = 0;
  for(j = 7; j >= 0; j--)
  {
   cChar += ibina[j] * iTemp;
   iTemp *= 2;
  }

  cout << cChar;

  ofile.write(&cChar, 1);
    }

 ifile.close();
 ofile.close();
}

 

--------------------------------------------------------------------------------------------------------

P.S.目前博客无法回复:(只好在这里回复。

 

回复 lovemysea:

ifile.read(cRead, NSIZE);所在的循环执行完后,cRead字符型数组的每一个元素(1个字节)的值是:0x30(即:0)或0x31(即:1)。
一个字节(8位)可对应成一个ASCII码,字符“0”的ASCII是“0x30”。
ibina整形数组的每一个元素(4个字节,32位),在后面“每8位为一个字节进行还原”转换时我们只使用ibina数组元素的最低位(存储的是:1或0)。
ibina[i] = (cRead[i] - '0'); 等价于ibina[i] = (cRead[i] - 0x30); 目的就是为了将从二进制文件读取到得8个二进制数分别存储到ibina数组的8个元素中。
这段代码,也是从网上整理而来,之前我也是不求甚解:-)正好一起学习了!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值