程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> %02hhX,

%02hhX,

編輯:關於C語言

%02hhX,


大家經常會遇到將 調試信息例如從網絡收到的數據包 或者 轉換後的數據 打印出來,調試問題。

如果以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進制形式,不過要注意 字節序問題。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved