MinGW-一种可以将小端数据转换为大端数据的方法
MinGW-一种可以将小端数据转换为大端数据输出的方法
问题背景
问题是这样的,客户提供了一份出错的log, log中记录了发送数据的详细信息(顺序、偏移量...), 通过分析log发现发送给对端的偏移量是错误的,这就需要分析发送的偏移量值是否正确:
也就是说有这样两个值:000C0000
, 000F0000
, 需要去看一下这两个值是否正确。
需要明确的是,log中记录的数据都是小端格式的,也就是说 000C0000
, 000F0000
这俩数据虽然记录的是这样,但实际上,它们应该是这样的:
00000C00
,00000F00
, 因此如果你想输出这两个值的所代表的十进制数据,需要手动将其转换成:0x00000C00
,0x00000F00
, 然后再打印输出。
这也太麻烦了!!!!
Linux 中有种函数叫:htonl()
或 ntohl()
, 位于:<arpa/inet.h>
头文件中,可以方便的进行主机字节序到网络字节序的转换(小端到大端的转换),因此在想能不能直接在code 中使用 这个函数把 0x000C0000
和 0x000F0000
转换成期望的大端格式输出?
直接在VSCode 中引入这个头文件,发现找不到(我用的是MinGW编译器)!
唉,总不至于测试这么个东西再起个Linux 虚拟机吧?
解决办法
后来发现其实MinGW中也是有 htonl()
或 ntohl()
这些函数的,只不过是放在了 <winsock.h>
文件夹下,引入这个文件就可以使用这两个函数了。不过需要注意的是,要使用这个两个函数,除了引入头文件之外,还需要指定这个函数所在的库的位置,否则链接时会出错。
因此你需要在task.json
中稍微修改一下:
做了如下修改之后就可以顺利的使用这两个函数了,参见下列code:
#include <stdio.h>
#include <winsock.h>
int main()
{
int c = 0x000C0000;
int d = 0x000F0000;
// 原始输出
printf("c = %d, d = %d\n", c, d);
// 小端转大端
printf("c = %d, d = %d\n", htonl(c), htonl(d));
getchar();
return 0;
}
运行:
这样就可以直接把log中的值,直接拷贝到 c, d 这两个变量处, 运行就能直接得到这两个值的结果了,自动转换小端为大端。