MinGW-一种可以将小端数据转换为大端数据的方法

MinGW-一种可以将小端数据转换为大端数据输出的方法

问题背景

问题是这样的,客户提供了一份出错的log, log中记录了发送数据的详细信息(顺序、偏移量...), 通过分析log发现发送给对端的偏移量是错误的,这就需要分析发送的偏移量值是否正确:

image-20221209180421706

也就是说有这样两个值:000C0000000F0000, 需要去看一下这两个值是否正确。

需要明确的是,log中记录的数据都是小端格式的,也就是说 000C0000000F0000 这俩数据虽然记录的是这样,但实际上,它们应该是这样的:

00000C0000000F00 , 因此如果你想输出这两个值的所代表的十进制数据,需要手动将其转换成:0x00000C000x00000F00, 然后再打印输出。

这也太麻烦了!!!!

Linux 中有种函数叫:htonl()ntohl(), 位于:<arpa/inet.h>头文件中,可以方便的进行主机字节序到网络字节序的转换(小端到大端的转换),因此在想能不能直接在code 中使用 这个函数把 0x000C00000x000F0000 转换成期望的大端格式输出?

直接在VSCode 中引入这个头文件,发现找不到(我用的是MinGW编译器)!

image-20221209181429506

唉,总不至于测试这么个东西再起个Linux 虚拟机吧?

解决办法

后来发现其实MinGW中也是有 htonl()ntohl()这些函数的,只不过是放在了 <winsock.h>文件夹下,引入这个文件就可以使用这两个函数了。不过需要注意的是,要使用这个两个函数,除了引入头文件之外,还需要指定这个函数所在的库的位置,否则链接时会出错。

因此你需要在task.json中稍微修改一下:

image-20221209181854017

做了如下修改之后就可以顺利的使用这两个函数了,参见下列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;
}

运行:

image-20221209182019825

这样就可以直接把log中的值,直接拷贝到 c, d 这两个变量处, 运行就能直接得到这两个值的结果了,自动转换小端为大端。

posted @ 2022-12-09 18:21  夜行过客  阅读(223)  评论(0编辑  收藏  举报