读取内容为十六进制数字的txt文件转换为二进制文件
前言
一个有趣的题目: 读取txt文件内容两两结合,存储为dat文件 , 实现十分简单, 有很多有意思的回答, 但大都是python, 其实这个用C的格式化读取fscanf( ) 配合二进制写入 fwrite( ) 就能轻松解决的.
一. 示例代码
fscanf( )
函数
int fscanf(FILE *stream, const char *format, ...)
有专门十六进制
读写, 还可以控制读写的长度, “%2X
”, 每次读长度为2的一个文本,转换为一个实际的数.
十六进制(hex)是一种基数为16的计数系统,是一种逢16进1的进位制。
通常用数字0、1、2、3、4、5、6、7、8、9和字母A、B、C、D、E、F(a、b、c、d、e、f)表示,
其中:A~F表示10~15,这些称作十六进制数字。
在fscanf()函数中, 十六进制的格式是%X, 而读取位数则是跟在%后的数字, 如%2X就是读取2位16进制数
fwrite( )
函数
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
将这个数用1字节存储到另一个文件中, 相当于进行了压缩.
这里有个取巧, 一个int占用4字节, 读出的是4字节内容, 但写入的时候只写入这个int的前八位, 也就是第一字节, 但如果比较贪心, 想一次存入多个字节, 比如4字节, 就会遇到一个问题, 字节序(大端序和小端序), 一般个人机是小端排序
, 这会导致4个字节的顺序倒置, 要小心.
a.txt内容如下,文本十六进制数字
1adcffa555
1dfacab555
c.dat内容如下(二进制)
1a dc ff a5 55 1d fa ca b5 55
#include <stdio.h>
int main()
{
FILE *fileIn = fopen("a.txt", "r");
FILE *fileOut = fopen("c.dat", "wb");
int res = 0;
while (fscanf(fileIn, "%2X", &res) != -1)
{
fwrite(&res, 1, 1, fileOut);
}
fclose(fileIn);
fclose(fileOut);
return 0;
}
总结
对十六进制比较了解的话, 配合C的标准库, 问题比较容易解决, 但字节序很容易忽略, 容易出现问题.