大家經常會遇到將 調試信息例如從網絡收到的數據包 或者 轉換後的數據 打印出來,調試問題。
如果以ascii碼打印的話,控制字符和ascii碼以外的字符不能很好的查看具體值(看不到,或者亂碼,尤其對於網絡報文)。
如果以16進制形式打印出來,就避免了這個問題。
輸出的格式經常不標准,對於一個字節 有時占1個字節空間7F,有時占8個字節空間FFFFFFFE。
現在就告訴大家一個標准的格式,不用考慮,內存空間是 有符號的字符串,還是無符號的字符串,亦或是 類型轉換等。
char *src;
printf("%02hhX", src);
hh 標示以一個字節char類型打印值。類似於h標示以一個short類型打印值一樣。(事實上就是內存空間的大小不一樣而已,char,short,int 如果都是無符號數,標示的值一樣,僅僅所占空間大小不同)
%X標示以16進制形式打印一個整數(int ,四個字節),對於unsigned或者signed的int來說,內存中存儲的值一樣,只是表示的值不一樣而已。
舉個例子,一個char 類型存儲的值為 0xFF,二進制就是8個位都是1, unsigned 標示 255,signed 標示 -1。
hh和X組合標示 以一個char類型打印一個整數,將四個字節的整數截斷成一個字節打印出來。
02 不夠2位的前邊補0 補成兩位打印出來,超過2位的以實際長度打印出來,
對於%02hhx,hhx已經以一個字節打印了,加上02限制,不夠兩位的補成兩位。
對於:
char a = '\xAB';
printf("%02X", a); //FF FF FF AB(最高位為1,符號擴展前面都補1, FF FF FF AB)
unsigned char a = '\xAB';
printf("%02X", a); //AB(無符號char,前面補0,實際上打印的值還是四個字節00 00 00 AB,只是前面都是0,所以以2位顯示出來而已)
所以 優選 %02hhX打印。
說明:以上一個int占4個字節,是在32位系統上。
%X以大寫字母打印十六進制
%x以小寫字母打印十六進制
char a = '\12' 八進制整數12
char a= '\012' 八進制整數12
char a='\x12' 十六進制整數12
linux 中有個 hexdump 打印文件的16進制形式,不過要注意 字節序問題。