2012-11-13 40 views
-2

我有一個十六進制字符串:解碼十六進制字符串給我的垃圾

12104c06134e5709140f104f02521b0a0442020c4d070b184f4815541f0800484e1e0241061d064d540b0a020210194510164d4f3a005343004e430e1e1d0a524612171b0117001b0e45431c0c1d160a520d11744e19061a114d0e55174f084e543714050b174353541b48070e000e4d

如果你好奇,我只是想解碼成可讀的文本(雖然這是一個加密問題,所以解碼文本會仍然看起來是無稽之談,但nonhexnonsense)。爲此,我已將上述消息保存到變量msg中。然後我執行此操作:

msg.decode('hex') 

然而,當我打印的價值,我得到一些字符,一堆奇怪的平方和文本碎片多條線路上。這是怎麼回事?

+4

您期望它打印什麼? – delnan

+0

那麼,我不是十分精通十六進制轉換給你一個我期望的確切表示,但基本上是一串英文字符和空格,一些大寫字母小寫。 – user1427661

+4

當我在這裏轉換你的十六進制(http://www.string-functions.com/hex-string.aspx)時,我得到了和你一樣的結果。十六進制不代表你認爲它做了什麼,或者你生成了一個不正確的十六進制字符串。 – Jodaka

回答

4

這聽起來像你認爲一些ASCII數據存儲在該十六進制字符串。如果是這種情況,則十六進制字符串中的每2個字符代表ASCII文本的一個字節。如果是這樣的話,你可以這樣做對它進行解碼:

>>> a = "12104c06134e5709140f104f02521b0a0442020c4d070b184f4815541f0800484e1e0241061d064d540b0a020210194510164d4f3a005343004e430e1e1d0a524612171b0117001b0e45431c0c1d160a520d11744e19061a114d0e55174f084e543714050b174353541b48070e000e4d" 
>>> bytes = [a[i:i+2] for i in range(0,len(a),2)] 
>>> s_decoded = [chr(int(c,16)) for c in bytes] 
>>> ''.join(s_decoded) 
'\x12\x10L\x06\x13NW\t\x14\x0f\x10O\x02R\x1b\n\x04B\x02\x0cM\x07\x0b\x18OH\x15T\x1f\x08\x00HN\x1e\x02A\x06\x1d\x06MT\x0b\n\x02\x02\x10\x19E\x10\x16MO:\x00SC\x00NC\x0e\x1e\x1d\nRF\x12\x17\x1b\x01\x17\x00\x1b\x0eEC\x1c\x0c\x1d\x16\nR\r\x11tN\x19\x06\x1a\x11M\x0eU\x17O\x08NT7\x14\x05\x0b\x17CST\x1bH\x07\x0e\x00\x0eM' 

但是,正如你所看到的,大多數人物都是「不可打印」的字符(即其ASCII值不代碼中的一些人可讀的字符如'A'或'd')。下面是一個解碼包含可打印ASCII字符的十六進制字符串的示例:

>>> a2 = "43616c6562" 
>>> bytes2 = [a2[i:i+2] for i in range(0,len(a2),2)] 
>>> bytes2 
['43', '61', '6c', '65', '62'] 
>>> ''.join([chr(int(c,16)) for c in bytes2]) 
'Caleb' 
>>> 
+0

呃,爲什麼不簡單寫''43616c6562'.decode('hex')'? –

+0

這種方式對於實際發生的事情更加明確。 – caleb

相關問題