【C++】 bin文件转换成txt文件

因学习需要,现要将二进制bin文件转化成十六进制格式并保存于txt文件中。

使用C语言编写该程序较为简单,定义FILE指针, 在合适的地方运用getc(),fprintf()函数即可。这里主要讲使用C++文件流方法。

一直以来对C++文件和流都不是太熟,遇到文件读写使用的都是C的方式。因此这次使用C++的方式编写该程序,记录编写过程中的一些细节和问题,防止今后再出错。

一、 什么是bin文件?

文件的后缀其实意义不大,它存在的意义是告诉用户或者程序该文件是什么格式,但文件内部是否按该格式存储并不一定。举个例子,有个.mp3音频文件,该后缀是为了告诉你,这是一个音频文件,你可以用通常的音乐软件打开它。我完全可以把该后缀更改为.docx文件,那这个文件变成文档了吗?并没有,只是电脑识别出,这个文件的后缀是.docx,你可以尝试使用word打开它,但是否能正确打开并读取文件中的信息,不能保证。事实上,这个.docx文件,你在点击右键,打开方式中仍然选择音乐播放软件,依旧可以播放音乐。当然,有些软件在打开文件之前就会检查后缀,不符合的不再继续进行的除外。我甚至可以将这个文件的后缀更改为.SeaOtter,并设置默认打开方式为网易云音乐,依旧能正确打开。所以,需要区分文件以什么格式存储,这是同后缀无关的。

那么什么是bin文件呢?通过上述分析,这里的bin文件我指的就不仅仅是.bin后缀的文件了,而是以二进制格式存储的文件。

二、如何打开bin文件?

打开bin文件的方式有很多,可以下载binary view软件,或者在notepad++中下载hex-editor插件。以后者为例,打开一个二进制文件后的截图如下,这里转换成了十六进制: 

图1 二进制文件

由于需要的也是将二进制文件转换成十六进制存储于.txt中,因此通过notepad++的hex-editor插件可以直接预览到正确转换结果。

三、bin2txt.cpp

写该程序需要学习文件流是如何读写二进制文件。通过网上查阅资料可以了解到,C++文件流可以读写文本文件和二进制文件。

对于读写文本文件,通常使用析取器(>>)和插入器(<<),同cin与cout是同一个含义,只不过cin就是ifstream,cout就是ofstream,这也是为什么叫做文件流的原因。

对于读写二进制文件,网上通常说选择析取器(>>)和插入器(<<)不会有语法错误,但是没有意义,通常使用get()和put()来进行字符的读写。但是实际操作中发现,读取二进制文件还是应该选择getc(),使用析取器(>>)会出现问题(下面会详述)。

代码如下:

#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;

int main()
{
	ifstream infile;
	infile.open("0927.bin", ios_base::binary);          //attention1
	
	ofstream outfile;
	outfile.open("output.txt", ios_base::binary);         
	
	char readByte;
	unsigned char readByte2;
	int cnt = 0;
	
	outfile << "unsigned char hex_num[ ] = " << endl;
	outfile << "{ " << endl;
	
	while(!infile.eof())
	{
		if(cnt % 16 == 0)
		{
			outfile << " " << endl;
			outfile << "   ";
		}
		infile.get(readByte);                              //attention2
		readByte2 = (unsigned char)readByte;               //attention3
		cnt++;
		outfile << "0x" << setfill('0') << setw(2);        //attention4
		outfile << hex << (unsigned int)readByte2;         //attention5
		outfile << ",";
		
	}
	
	outfile << " \n";
	outfile << "}; \n";
	infile.close();
	outfile.close();
	
	return 0;
}

来看一下五个attention:

attention1:ios::binary,表明为二进制文件读写,使用该语句可以避免遗漏特殊字符,比如0x0d,0x0a等。但是实测该语句并没有这样的功效……还望解答;

attention2:infile.get(readbyte),get()函数要求参数为char类型,因此readByte定义为char类型。这里注意不能使用infile>>readByte,否则会丢失0x0d等特殊字符;

attention3:强制转换。由于get()函数的参数要求为char类型,但是二进制文件每8位一组,很可能大于127,因此需要再强制转换位unsigned char类型;

attention4:格式设定。不同于C语言中可以通过fprintf(txtFile,"0x%02x,",readByte)直接输出两位的十六进制数,C++文件流要复杂一些,但是相对清晰很多。setfill('0')用于高位填0,setw(2)用于指定输出两位,这两个函数需要包含头文件iomanip。

attention5:进制设定。用于输出十六进制数,这里要注意,hex后要跟着整型数才可正确输出,如果不进行unsigned int强制转换,会输出乱码。

程序很简单,但是写该程序时因为丢失0x0d,0x0a等特殊字符而卡了很久,之前在网上看二进制文件选择析取器无伤大雅,就没有使用get()函数,结果总是会丢失特殊字符,即便加了ios::binary也无法解决,最后选择了get()才完整读取了下来。对于输出部分,仍使用的是插入器(>>),因为输出到了文本文件中。

通过这次的小尝试,了解了C++的文件流,比起C语言的文件读写,“流”的概念使得文件读写过程更为清晰,同cin,cout能够关联上。但是也有较为复杂的地方,比如格式与进制的设定过程。最重要的是,要弄清楚读取与写入的文件类型,至少在我的实验当中,二进制文件选择get(),put()组合(如果输出也输出到二进制文件的话)不容易错。

对于我出现的问题,如果有朋友能帮忙解决infile >> readByte与ios::binary组合为什么依旧会丢失特殊字符的问题,麻烦评论区留言,感谢!

  • 4
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 将txt文件换为bin文件需要使用二进制换工具。二进制文件是一种以二进制数值表示的计算机文件,其中每个二进制数码用于表示存储在计算机中的数据。而txt文件则是一种基于文本的文件格式,其中数据以ASCII码字符表示。 要将txt文件换为bin文件,需要遵循以下步骤: 1.打开txt文件,并使用二进制编辑器将其化为二进制数码。 2.使用二进制换工具将二进制数码换为二进制文件。这一步会将txt文件中所有文本化为计算机可以识别的二进制数字。 3.保存二进制文件并确保其正确性。这通常需要在二进制文件工具中进行自我检验,或者比较txt文件和生成的bin文件以确保数据的正确性。 需要注意的是,将txt文件换为bin文件有一定的风险和复杂性。如果数据格式不正确或者错误地编码,可能会导致在换过程中丢失或者破坏数据。因此,在进行数据换之前,请确保备份您的原始数据并谨慎处理。 ### 回答2: 将txt文件换为bin文件是一个比较基本的文件换工作,通常用于将文本信息换为二进制数据,以便于在计算机中进行处理和存储。 txt文件是一种文本文件,存储的是以字符形式表示的文本信息,而bin文件则是一种二进制文件,存储的是以二进制形式表示的数据信息。因此,在将txt文件换为bin文件时,需要将文本信息换为对应的二进制数据,并进行存储。 一种简单的方法是使用编程语言实现换功能,例如C++或Python。通过读取txt文件中的文本信息,并将它们换为二进制数据,然后将这些二进制数据写入到新的bin文件中,就可以实现txt文件bin文件换。 下面是一个简单的C++代码示例,用于将txt文件换为bin文件: #include <iostream> #include <fstream> #include <string> using namespace std; int main() { //读取txt文件中的文本信息 ifstream input; input.open("input.txt"); string content; getline(input, content); input.close(); //将文本信息换为二进制数据 char* binary_data = new char[content.size() + 1]; memcpy(binary_data, content.c_str(), content.size() + 1); //将二进制数据写入到bin文件中 ofstream output; output.open("output.bin", std::ios::binary); output.write(binary_data, content.size() + 1); output.close(); delete[] binary_data; return 0; } 上述代码中,首先通过ifstream读取输入文件input.txt中的文本信息,然后通过memcpy将其换为char数组,进而表示为对应的二进制数据。最后,使用ofstream以二进制方式打开输出文件output.bin,并使用write方法将二进制数据写入到该文件中。 以上是一种基本的将txt文件换为bin文件的方法,具体实施时可以根据自己的需求进行进一步的优化和改进。 ### 回答3: 将txt文件换为bin需要经过编码和解码的过程。Txt文件是以文本形式存储的,而bin文件则是以二进制形式存储的,因此将txt文件换为bin需要将文本数据换为二进制数据。 具体实现方法是可以使用软件或编程语言中的函数进行换。例如在Python中,可以使用open函数读取txt文件的文本内容,然后使用struct.pack函数将文本数据换为二进制数据,并写入新的bin文件中。如下所示: ```python import struct with open('example.txt', 'r') as f_txt: txt_content = f_txt.read() bin_content = struct.pack('s', txt_content.encode('ascii')) with open('example.bin', 'wb') as f_bin: f_bin.write(bin_content) ``` 在这个例子中,我们将文本数据先用ascii编码方式换为字节(bytes),然后使用struct.pack函数将字节打包成二进制数据。其中,s表示转换成字符串类型,具体根据实际情况而定。 使用这种方法可以将txt文件换为bin文件,也可以使用其他编程语言中相应的函数实现。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值