/*
说明:程序只能处理不带回车/换行的二进制文件。
[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个元素中。
这段代码,也是从网上整理而来,之前我也是不求甚解:-)正好一起学习了!
本文介绍了一种将二进制文件转换为文本的方法,并提供了一个C++实现示例。该程序能够读取特定格式的二进制文件并将其转换为对应的ASCII文本。

4万+

被折叠的 条评论
为什么被折叠?



