MinGW-一種可以將小端資料轉換為大端資料的方法
阿新 • • 發佈:2022-12-09
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 這兩個變數處, 執行就能直接得到這兩個值的結果了,自動轉換小端為大端。