2012-07-27 27 views
2

在Python中,我想將整數3892轉換爲具有給定格式和結果\x00\x00\x0F\x34的十六進制代碼。這怎麼能實現?在Python中將整數轉換爲十六進制

+0

如果整數超過32位? – martineau 2012-07-27 11:06:45

+0

希望它不會是 – fernandes 2012-07-27 11:54:13

+1

嗯,所以你希望基於希望和祈禱的代碼,沒問題。當你說「具有給定格式的十六進制代碼」時,你的意思是字面上的一串字節,代表大字節機器上的32位值「0x0f34」,還是字面意義上的字符串「」\\ x00 \\ x00 \\ \\ X0F X34" '? – martineau 2012-07-27 18:33:19

回答

8

您正在轉換爲數字的二進制表示,而不是十六進制表示(儘管Python將以十六進制顯示字節)。使用struct module進行此類轉換。

演示:

>>> struct.pack('>I', 3892) 
'\x00\x00\x0f4' 
>>> struct.pack('>I', 4314) 
'\x00\x00\x10\xda' 

注意,對於「4」的ASCII碼是0x34,蟒僅顯示與\x逃逸字節,如果它是一個非打印字符。因爲0x34是可打印的,Python代替4輸出。在上面的格式化代碼中,''表示'big endian',而'I'表示無符號的int轉換(4字節)。

+0

是不是3892十進制0xf34十六進制? – martineau 2012-07-27 11:11:57

+0

@martineau:我在我的回答中解決了這個問題。 python顯示'4',因爲這是代碼位置0x34處的ASCII字符。因此,字節序列中的最後一個字符是'\ x34',但因爲它是可打印的,所以它不會顯示爲十六進制轉義。 – 2012-07-27 11:44:27

+0

嗯,我現在在你的回答中明白你的意思,謝謝。目前還不清楚OP是否需要這個或者@ cdarke的答案產生的結果,但是懷疑它可能是前者,所以必須添加我自己的+1。 – martineau 2012-07-27 18:17:00

1

如果你已經安裝numpy的:

>>> import numpy as np 
>>> np.int32(3892).tostring() 
'4\x0f\x00\x00' 
+0

感謝您的快速解答!但是我需要將\ x00 \ x00 \ x0F \ x34作爲實際結果,因爲我必須將其導回到文件中。是否有可能做到這一點? – fernandes 2012-07-27 08:05:10

2
import re 
print re.sub(r'([0-9A-F]{2})',r'\\x\1','%08X' % 3892) 

給出:

\x00\x00\x0F\x34 
+0

哇!多數民衆贊成它 - 真的很酷。非常感謝。 @cdarke爲了我平庸的正則表達式技巧:你能給我一個短暫的正則表達式嗎? – fernandes 2012-07-27 09:59:13

+0

這會生成一個16字符的字符串,其中包含文字反斜槓,文字「x」和文字數字。 ''%08X'產生十六進制數字,正則表達式每兩位數字插入一個文字'\ x'。我的解決方案生成* 4 *字節,其中包含您的數字作爲無符號[C長整型值](https://en.wikipedia.org/wiki/Integer_%28computer_science%29#Common_long_integer_sizes)。你需要弄清楚你需要寫入你的文件的格式;如果它是一種二進制格式,我的答案就是我的答案。 :-) – 2012-07-27 18:40:00

+0

對不起,我一直在旅行。 RE如下(除了@Martijn Pieters的正確解釋):'([0-9A-F] {2})'只查找2個十六進制數字。括號()捕獲我們匹配的內容,並在替換字符串中表示爲'\ 1'(稱爲後向引用)。 '\\ x'用'\ x'前綴捕獲的兩個字符。如果你對此感到滿意,如果你接受了我的解決方案,那將會很好,但我同意其他人的觀點,即你的問題有點含糊。 – cdarke 2012-07-27 19:33:45

相關問題