1. 程式人生 > 其它 >MinGW-一種可以將小端資料轉換為大端資料的方法

MinGW-一種可以將小端資料轉換為大端資料的方法

MinGW-一種可以將小端資料轉換為大端資料輸出的方法

問題背景

問題是這樣的,客戶提供了一份出錯的log, log中記錄了傳送資料的詳細資訊(順序、偏移量...), 通過分析log發現傳送給對端的偏移量是錯誤的,這就需要分析傳送的偏移量值是否正確:

也就是說有這樣兩個值:000C0000000F0000, 需要去看一下這兩個值是否正確。

需要明確的是,log中記錄的資料都是小端格式的,也就是說 000C0000000F0000 這倆資料雖然記錄的是這樣,但實際上,它們應該是這樣的:

00000C0000000F00 , 因此如果你想輸出這兩個值的所代表的十進位制資料,需要手動將其轉換成:0x00000C000x00000F00, 然後再列印輸出。

這也太麻煩了!!!!

Linux 中有種函式叫:htonl()

ntohl(), 位於:<arpa/inet.h>標頭檔案中,可以方便的進行主機位元組序到網路位元組序的轉換(小端到大端的轉換),因此在想能不能直接在code 中使用 這個函式把 0x000C00000x000F0000 轉換成期望的大端格式輸出?

直接在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 這兩個變數處, 執行就能直接得到這兩個值的結果了,自動轉換小端為大端。