将小Endian hexdump输出转换为Big Endian的问题(C编程)

时间:2018-05-13 18:37:50

标签: c endianness

我正在努力解决一个问题,这个问题要求我使用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;。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:0)

您告诉fwritesizeof(int)个字节,在您的系统上评估为4个字节(int的大小为4)。如果要写两个字节,只需执行:

fwrite(&swapped, 2, 1, dest_file);

答案 1 :(得分:0)

为减少混淆,重新排序字节的代码应使用字节(uint8char),而不是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写入文件,这可能是不正确的。如果您使用字节,则不会有任何意外 - 您的代码完全按照它的样子执行。