我正在努力解决一个问题,这个问题要求我使用fopen()函数创建的目标文件执行十六进制转储。
我已经声明了必要的整数变量(在HEX中),如下所示:
//Declare variables
int code = 0xCADE;
输出必须是大Endian,所以我以这种方式交换了字节:
//Swap bytes
int swapped = (code>>8) | (code<<8);
然后我以这种方式打开二进制输出文件:
//Open file for binary writing
FILE *dest_file = fopen(filename, "wb");
之后,我使用fwrite()以下列方式将变量代码(对应16位字)写入文件:
//Write out first word of header (0xCADE) to file
fwrite(&swapped, sizeof(int), 1, dest_file);
在已写入内容的文件上编译,运行和执行hexdump后,我观察到以下输出:
0000000 ca de ca 00
0000004
基本上一切都是正确的,直到额外的&#34; ca 00&#34;。我不确定为什么会这样,需要将其删除,以便我的输出只是:
0000000 ca de
0000004
我知道Endianness问题已在堆栈中得到广泛解决,但在执行搜索之后,我不清楚如何对此问题进行分类。我怎样才能解决这个问题,以便&#34; ca 00&#34;被删除?
非常感谢。
编辑:
我改变了两者:
//Declare variables
int code = 0xCADE;
//Swap bytes
int swapped = (code>>8) | (code<<8);
为:
//Declare variables
unsigned short int code = 0xCADE;
//Swap bytes
unsigned short int swapped = (code>>8) | (code<<8);
我观察到:
0000000 ca de 00 00
0000004
这使我更接近我需要的东西,但仍有额外的&#34; 00 00&#34;。任何帮助表示赞赏!
答案 0 :(得分:0)
您告诉fwrite
写sizeof(int)
个字节,在您的系统上评估为4个字节(int
的大小为4)。如果要写两个字节,只需执行:
fwrite(&swapped, 2, 1, dest_file);
答案 1 :(得分:0)
为减少混淆,重新排序字节的代码应使用字节(uint8
或char
),而不是int
等多字节类型。
交换两个字节:
char bytes[2];
char temp;
fread(bytes, 2, 1, file1);
temp = bytes[0];
bytes[0] = bytes[1];
bytes[1] = temp;
fwrite(bytes, 2, 1, file2);
如果你使用int
,你可能会欺骗自己,假设它的大小是2(虽然它最有可能是4),并假设你的系统如何将int
写入文件,这可能是不正确的。如果您使用字节,则不会有任何意外 - 您的代码完全按照它的样子执行。