2011-07-26 165 views
19

出於好奇,二進制代碼如何轉換爲字母?我知道有些網站會自動將二進制轉換爲單詞,但我想了解二進制代碼在轉換爲字母之前經過的具體中間步驟。二進制代碼如何轉換爲字母?

+0

你是什麼意思的二進制代碼?你是指從ASCII碼到相應的字母? – Giorgio

回答

17

假定由「二進制代碼」你的意思只是普通的舊數據(字節的比特序列,或),並且通過「字母」你的意思的字符,答案是在兩個步驟。但首先,一些背景。

  • 一個字符只是一個命名符號,如「拉丁大寫字母A」或「希臘小寫字母PI」或「黑色棋子騎士」。不要將字符(抽象符號)與字形(字符的圖片)混淆。
  • 字符集是一組特定的字符,其中的每一個是用特殊號碼相關聯的,被稱爲其編碼點。要查看Unicode字符集中的代碼點映射,請參閱http://www.unicode.org/Public/UNIDATA/UnicodeData.txt

好了,現在這裏有兩個步驟:

  1. 的數據,如果是文本的,必須以某種方式由字符編碼陪同,像UTF-8,拉丁語1, US-ASCII等。每個字符編碼方案詳細指定字節序列如何被解釋爲碼點(以及相反如何將碼點編碼爲字節序列)。

  2. 一旦字節序列被解釋爲代碼點,你有你的角色,因爲每個角色都有一個特定的代碼點。

一對夫婦的注意事項:

  • 在一些編碼,某些字節序列對應碼點沒有在所有的,所以你可以有字符解碼錯誤。
  • 在某些字符集中,有些未使用的代碼點,也就是說,它們完全不符合任何字符。

換句話說,不是每一個字節序列意味着什麼爲文本。

+0

非常有啓發性的迴應。包含重要的知識,這些知識將被很好地利用。 –

7

你的意思轉換011001100110111101101111foo,例如?您只需將二進制流分成不同的字節(01100110,01101111,01101111),並查找與給定數字對應的ASCII字符。例如,01100110是十進制102和與代碼102的ASCII字符是f

$ perl -E 'say 0b01100110' 
102 
$ perl -E 'say chr(102)' 
f 

See what the chr function does)。您可以概括該算法,並有不同數目的每個字符的比特和不同的編碼,該點保持的一樣。

0

爲什麼不只是這樣做需要010010001001001把它分成兩個位8個字母每個(01001000,01001001)。然後發出權力

01001000. 01001001.

第8忽略他們確定它是資本與否,就在去左做權力前三2(2^1,2^2^2 3 2^4 2^5)。因此,然後添加所有的一個,只有一個,它= 8,字母表中的八個字母是h,所以我們的第一位是字母h,嘗試在另一位

16

這是一種轉換二進制數字轉換爲ASCII字符,這通常足夠簡單,可以在您的腦海中完成。

1 - 每4個二進制數字轉換成一個十六進制數字。

這裏的一個二進制進制轉換圖表:

0001 = 1 
0010 = 2 
0011 = 3 
0100 = 4 
0101 = 5 
0110 = 6 
0111 = 7 
1000 = 8 

1001 = 9 
1010 = a (the hex number a, not the letter a) 
1011 = b 
1100 = c 
1101 = d 
1110 = e 
1111 = f 

(十六進制數a到f是十進制數10〜15這就是十六進制或「基地16」 - 而不是每個數字能夠代表10個不同的數字[0 - 9],如十進制或「base 10」,每個數字代替16個不同的數字[0 - f]。)

一旦您知道該圖表,任何一串二進制數字轉換爲一串十六進制數字很簡單。

例如,

01000100 = 0100 0100 = 44 hex 
1010001001110011 = 1010 0010 0111 0011 = a273 hex 

夠簡單了吧?將一個任意長度的二進制數轉換爲十六進制等價物是一件簡單的事情。

(這是可行的,因爲十六進制是16進制數,二進制數是2進制數,16是4的2次方,所以需要4個二進制數來使1進制數10。 2,所以我們不能二進制轉換爲幾乎一樣容易十進制)

2 - 斯普利特的十六進制數字串入對。

當轉換一個數字成ASCII碼,每2位十六進制數字是一個字符。因此,將十六進制字符串分成兩組數字。

你會分裂像7340298b392這樣一個十六進制數爲6對,是這樣的:

7340298b392 = 07 34 02 98 b3 92 

(請注意,我前面有個0,因爲我有奇數個十六進制數字。)

這6對十六進制數字,所以它將成爲6個字母。 (除了我馬上知道98,B3和92不是字母,我將在一分鐘內解釋它爲什麼。)

3 - 將每對十六進制數轉換爲十進制數。

由16左邊的數字(的十進制等效)相乘,並添加第二個做到這一點。

例如,b3十六進制= 11 * 16 + 3,即110 + 66 + 3,它是179. (b十六進制是11位十進制。)

4 - 轉換十進制數轉換成ASCII字符。

現在,要獲取十進制數字的ASCII字母,請記住,在ASCII中,65是大寫的'A',而97是小寫的'a'。

那麼什麼字母是68?

68是大寫字母的第4個字母,對嗎?
65 = A,66 = B,67 = C,68 = D.

所以68是'D'。

如果數字小於97,則取大寫字母減去64;如果數字大於等於97,則取96小寫字母,即與該組相關的字母表的字母數字2個十六進制數字。


另外,如果你不害怕容易進制運算的一點點,你可以跳過第3步,只是徑直從十六進制ASCII碼,通過記住,例如,

hex 41 = 'A' 
hex 61 = 'a' 

因此,將大寫字母減去40個十六進制或對小寫字母減去60個十六進制,然後將剩餘的轉換爲十進制以獲取字母表字母編號。

例如

01101100 = 6c, 6c - 60 = c = 12 decimal = 'l' 
01010010 = 52, 52 - 40 = 12 hex = 18 decimal = 'R' 

(這樣做時,它有助於記住「M」(或「M」)是字母表中的13號。所以,你可以或正數從13下降。發現了一封信,這比到兩端靠近中間)

我看到這個襯衫上的一次,並能夠在我的頭上來閱讀:

01000100 
01000001 
01000100 

我做了這樣的:

01000100 = 0100 0100 = 44 hex, - 40 hex = ucase letter 4 = D 
01000001 = 0100 0001 = 41 hex, - 40 hex = ucase letter 1 = A 
01000100 = 0100 0100 = 44 hex, - 40 hex = ucase letter 4 = D 

這件襯衫上寫着「DAD」,我認爲它有點酷,因爲它是由一名孕婦購買的。她的丈夫一定是像我這樣的怪胎。


我怎麼知道92,b3和98不是字母?

因爲對於一個小寫 'Z' 的ASCII碼是96 + 26 = 122,這在十六進制爲7A。 7a是一個字母的最大十六進制數字。大於7a的任何東西都不是字母。


所以這就是你如何做到這一點的人。

計算機程序如何做到這一點?

對於每組8位二進制數字,將其轉換爲數字,然後在ASCII表中查找。

(這是一個非常明顯而直接的方法,一個典型的程序員可能在幾分鐘的時間內想到10或15個其他方法,細節取決於計算機語言環境。)

+0

謝謝。我發現不用十六進制數字就可以更容易閱讀,也就是直接將'01000100'看作'2^6 + 2^2' = 68。 – Blauhirn

+0

有趣。讓我們看看,我猜最右邊的數字是2^0,所以2^6是最右邊的第7個數字。 2^6是.. 2,4,8,16,32,64 ..和2^2是2 * 2,它是4,所以,對,那是68.Ascii代碼是8位寬,所以我如果你知道2到7位的功能(因爲01111010是最大的字母),那麼這種方法可能是足夠實用的,儘管像01011010這樣的方法可能比如果你只知道4位的十六進制數字要長一些。 0101 = 5,1010 = A,所以5A。轉換爲字母:0x5A - 0x40(大寫字母)= 0x1A = 16 + 10 = 26(大寫字母)='Z'。 – Shavais

+0

如果你真的喜歡用十進制工作,我猜你實際上可以知道小數位數爲4位,並且對於每組8位,將左邊的數乘以16,並添加第二組。所以0101:1010 = 5:10 = 5 * 16 + 10 = 50 + 30 + 10 = 90.如果您知道64是大寫字母減去的十進制數,那麼您會得到26('Z')。 – Shavais

相關問題