2014-09-02 55 views
0

我有一個base64字符串,我試圖找出它是什麼,但我什麼也看不見。我究竟做錯了什麼?這是爲什麼我看不到解碼的字符串?

>>> import base64 
>>> b = base64.b64decode("FAAAAAMAAAAGAAAACQAAAAwAAAA=") 
>>> b 
b'\x14\x00\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\x0c\x00\x00\x00' 
>>> print(b.decode("utf16")) 


>>> print(b.decode("utf8")) 


>>> 

回答

2

它是Base 64編碼,那麼它不是UTF-16編碼,也不是UTF-8。看看RFC 3548。 Base 64可以在文檔的第4頁找到。

實際上,其目的不同。 UTF-x編碼在這裏將unicode字符串編碼爲二進制流。也就是說,抽象字符串是解碼後的形式。另一方面,Base X等編碼在這裏編碼原始二進制到一個選定的ASCII值(基本上是小整數)的流,使二進制內容可以通過電子郵件傳輸,只接受字符。二進制文件是解碼後的原始格式。

在你的情況,它看起來隨着如果整數(32位)的系列被轉移:20,3,6,9,和12

以後更新回答下面的評論:我是如何得到的值...

b'\x14\x00\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\x0c\x00\x00\x00' 

字面的b前綴說,這是字面與bytes類型值。 bytes是一個小整數流 - 每一個字節,從0到255。當顯示爲文字時,如果相關的ASCII字符不容易顯示,則使用小整數的十六進制表示法 - 以\x後跟兩個十六進制數字。該\t是具有順序值9

然而製表符的表示,你也可以將其轉換爲整數的列表:

>>> list(b) 
[20, 0, 0, 0, 3, 0, 0, 0, 6, 0, 0, 0, 9, 0, 0, 0, 12, 0, 0, 0] 

現在是更加明顯。如果值足夠小以適合單個字節,則零是填充符。字節的順序是由操作系統/機器的字節序造成的。所以,實際上,應該是六(五32位整數):

00000014 00000003 00000006 00000009 0000000c 

那就是:

 20  3  6  9  12 

換句話說,該b'\x14\x00\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\t\x00\x00\x00\x0c\x00\x00\x00'其實並不是一個字符串。這是一個bytes文字,它捕獲5 * 4字節的值。 bytes是一個小整數序列,不是字符。當您嘗試時更明顯:

>>> for value in b: 
...  print(value) 
...  
20 
0 
0 
0 
3 
0 
0 
0 
6 
0 
0 
0 
9 
0 
0 
0 
12 
0 
0 
0 
>>> type(b) 
<class 'bytes'> 
>>> type(b[0]) 
<class 'int'> 
>>> 
+0

感謝您的回答。你能告訴我你是如何得到該字符串的整數值的?我試圖從基於64編碼的字符串中找出一些意義。 – aaragon 2014-09-02 20:31:44

+0

應該將20與編碼字符串中的整數數量相關聯嗎? – aaragon 2014-09-02 21:48:45

+0

這不是一個字符串。它是'字節'值。無論如何,'20'肯定不是* Python相關的。原始字符串只是一個字符串,「base64.b64decode」的結果是一個字節序列。我的解釋是,這些值可能是五個32位整數,只是猜測。這是你的問題相關。我不知道如何解釋價值。 – pepr 2014-09-03 13:49:53

相關問題