痛點:位元組十六進制輸出的混亂現狀
調試網路封包、二進制資料時,常需將 unsigned char/signed char 以十六進制列印。常見問題:
%X 對 char 產生符號擴展:0xAB → FFFFFFFAB(有號)或 000000AB(無號)。
- 輸出長度不一:有的 2 字元,有的 8 字元,對齊困難。
- 需手動轉型
(unsigned char) 易忘、易錯。
神奇格式:%02hhX
char *src = ...;
printf("%02hhX", src[i]); // 單一位元組,固定 2 位大寫十六進制,不足前補 0
格式拆解
| 元件 | 含義 |
hh | 長度修飾符:指定對應引數為 signed char 或 unsigned char(1 位元組) |
X | 大寫十六進制整數輸出 |
02 | 最寬度 2,不足前補 0 |
實測對比
char a = '\xAB'; // 有號 char,值 -85
unsigned char b = '\xAB'; // 無號 char,值 171
printf("%02X\n", a); // FFFFFFAB (符號擴展 32 位)
printf("%02X\n", b); // AB (實際仍傳 32 位 000000AB,前導 0 被省略)
printf("%02hhX\n", a); // AB (截取低 8 位,固定 2 字元)
printf("%02hhX\n", b); // AB
為何 %02hhX 是最佳選擇
- 型別無關:無論
signed/unsigned char、int 截斷,皆正確取低 8 位。
- 格式統一:固定 2 字元大寫,日誌對齊完美。
- 標準 C99:現代編譯器(GCC、Clang、MSVC)全支援。
補充:相關格式速查
| 格式 | 輸出範例 | 用途 |
%02hhX | AB | 單位元組十六進制(推薦) |
%02hX | 00AB | short (2 位元組) |
%04X | 0000ABCD | int (4 位元組) |
%hhx | ab | 小寫版 |
工具輔助:hexdump
hexdump -C file.bin # 含位移、十六進制、ASCII 三欄,注意大小端序
總結
拋棄手動轉型與不定長輸出,全面採用 %02hhX 列印位元組十六進制,是 C 語言二進制資料調試的專業標準寫法。
- 上一篇文章: GCC -fstack-protector 堆疊保護機制原理、反組譯對比與實戰除錯
- 下一篇文章: C 語言 const 關鍵字深度解析:指標常量、常量指標與多級 const 讀寫規則
Copyright ©
程式碼之家 All Rights Reserved