2010-12-06 37 views
7

我試圖創建一些需要傳輸的數據的十六進制表示(具體來說,在ASN.1表示法中)。在某些點上,我需要將數據轉換爲十六進制表示。由於數據以字節序列傳輸,因此如果長度爲奇數,則十六進制表示必須用0填充。有沒有辦法填充偶數個數字?

例子:

>>> hex2(3) 
'03' 
>>> hex2(45) 
'2d' 
>>> hex2(678) 
'02a6' 

的目標是找到hex2簡單,優雅的實現。

目前我使用的是hex,刪除前兩個字符,如果長度奇數,則用0填充該字符串。不過,我想爲未來的參考找到更好的解決方案。我查看了str.format,但沒有發現任何可以填充到倍數的東西。

+0

我認爲這是好,因爲你會得到,當然除了如果有標準libray一個隱藏的寶石... – delnan 2010-12-06 16:39:34

回答

7
def hex2(n): 
    x = '%x' % (n,) 
    return ('0' * (len(x) % 2)) + x 
-1

可能想看看struct模塊,它是爲面向字節的I/O而設計的。

import struct 
>>> struct.pack('>i',678) 
'\x00\x00\x02\xa6' 
#Use h instead of i for shorts 
>>> struct.pack('>h',1043) 
'\x04\x13' 
+2

沒有,這有與這個問題很少有關。請刪除或更新您的答案。 – tzot 2011-01-05 13:26:43

7

要完全誠實的,我不知道是什麼問題。直接實現的你的描述是這樣的:

def hex2(v): 
    s = hex(v)[2:] 
    return s if len(s) % 2 == 0 else '0' + s 

我不一定會稱之爲「優雅」,但我肯定會稱之爲「簡單」。

+0

如果`v`碰巧是一個`long`,那麼`hex(v)`將會有一個尾隨的`L`,並且這個函數返回的值也會有它。 – Louis 2015-04-15 12:10:43

0

Python的binascii模塊的b2a_hex保證返回一個長度爲偶數的字符串。

接下來的技巧是將整數轉換爲字節串。 Python3.2及以上具有內置爲int:

from binascii import b2a_hex 

def hex2(integer): 
    return b2a_hex(integer.to_bytes((integer.bit_length() + 7) // 8, 'big'))