2009-11-20 51 views
7

這是一個奇怪的問題,一直困擾着我。該程序是用C89編寫的,它一次將一個文件讀取到char *數組中,每次16個字節(使用fread和sizeof(char))的大小。該文件是用「rb」標誌打開的。然後將該數組傳遞給一個函數,該函數基本上取16個十六進制值並將其粘貼到一個字符串中,每個值由一個空格分隔。打印出C中char *數組的十六進制值給出二進制輸入的奇數值

這裏是古怪的地方。函數產生一個很好的十六進制轉儲,一次16個字節,用於我有的文本文件輸入。但是,如果我嘗試在一個小的位圖圖像 - 它結束了輸出字符串,如ffffff88,而不是隻有88.

十六進制值被放置到輸出字符串使用sprintf(「%02x」 ,輸入[i]);在一個循環中。

爲什麼這可以正常使用某些文件而不是其他文件?

回答

9

你看到的是從char符號擴展到int,使用unsigned char *或鑄造unsigned char劇組之前爲int(隱含?)執行應該解決您的問題的結果。

11

在C中,char被視爲有符號值,除非您指定它爲無符號。看起來,當你將參數傳遞給一個函數時,當參數恰好是一個char時,它被「填充」到一個常規整數的大小。如果你不知道編譯器是否應該以無符號方式進行編譯,那麼128會變成0xFFFFFF80,依此類推。

因此,符號擴展發生在打印格式化程序開始查看該值之前。這意味着是

printf("%02X", (unsigned) input[i]); 

不會解決問題,作爲輸入[I]的值將被符號擴展的,所以從128到255的所有值都爲-127處理以-1和成爲0xFFFFFF80到0xFFFFFF,然後投,而

printf("%02X", ((unsigned char *) input)[i]); 

會做的伎倆,但是有點難看,很難看。最好使輸入[]的類型首先是unsigned char。

相關問題