2017-01-10 210 views
-5

我正在讀取一個ASCII文件並試圖將其轉換爲二進制文件。ASCII到二進制轉換?

我的代碼是這樣的:

void AtoB(char * input) 
{ 
int ascii; 
int length = strlen(input); 

for(int x=0;x<length;x++) 
{ 
    ascii = input[x]; 

這裏,當我經由管線`ASCII =輸入讀取來自象È文件中的單個字符[X];

我得到的值-56 [如果爲ASCII類型是int]和ASCII = 4294967240 [如果爲ASCII類型爲unsigned int],並在此基礎上我的輸出也changing.I稱爲ASCII表在這裏:http://www.simotime.com/asc2ebc1.htm ,仍然無法理解這些值以及它被分配給字符的依據是什麼↓

注意:我在Win 7 64bit上使用Visual Studio 2010來編寫此代碼(這可能沒有關係,仍然給出這個註釋)。 編碼是ANSI。

任何人都可以請幫我理解這一點嗎?謝謝。

The screen shot of ASCII file

+3

不要發送垃圾郵件標籤。 C不是C++不是C! – Olaf

+5

'È'不是[ASCII](https://en.wikipedia.org/wiki/ASCII)字符。實際使用哪種編碼? – ikegami

+0

請顯示[mcve]。 –

回答

3

È不是ASCII字符。我們假設文件實際上是使用cp1252[1]編碼的。

È使用cp1252編碼的是C8(十六進制)。

如果您解釋C8爲8位無符號整數,這是200

如果您解釋C8作爲一個符號的8位整數,它是-56。

如果您解釋C8作爲一個符號的8位整數,然後將它擴展到一個符號的32位整數,然後將其轉換爲32位無符號整數,這是4294967240.

讓你有預期值;你只是以不同於預期的方式來解釋它。


  1. 用來使在不限定UNICODE構建系統調用(的LPCTSTRLPTSTR參數編碼到系統調用)的編碼被稱爲「ANSI」編碼。實際的編碼可能因機器而異。但是,對於(絕大多數?)英語Windows機器的「ANSI」編碼是cp1252。
+0

謝謝。在我的問題中添加了編碼。 https://en.wikipedia.org/wiki/Windows-1252 – AskMe

+0

CP1252很常見。但是,我曾經使用過的所有版本的Windows和MS-DOS上的_console_的默認編碼都是CP437。去'chcp'。 –

+0

@Tom Blodget,1)cp437是OEM代碼頁(由控制檯使用),而不是ANSI代碼頁(用於系統調用)。如果你的OEM cp是437,我願意打賭你的ANSI cp是1252. 2)我的OEM代碼頁是[850](https://en.wikipedia.org/wiki/Code_page_850),而不是437.在我的所有機器上始終是850。我認爲這是因爲加拿大而不是美國。 cp850有更多重音字母,所以它符合我們的兩種官方語言。 3)cp437不包括'È',所以我們顯然不是在談論cp437。 – ikegami

2

根據你的表,È是二進制11001000
char被簽名時,11001000被解釋爲-56。
當它的無符號的值是200。

-56在32位是11111111111111111111111111001000,當解釋爲無符號整數,它是4294967240。