4

これは Python の数値を 16 進文字列に変換する最良の方法ですか?

number = 123456789
hex(number)[2:-1].decode('hex')

1234567890 を実行すると、機能せず、奇数長の文字列について不平を言うことがあります。

説明:

私はintからhexに行きます。

また、エスケープする必要があります。

IE: 1234567890 -> '\x49\x96\x02\xd2' は '499602D2' ではありません

また、任意の Python 整数を取得できる必要があります。すなわち。Int より大きいもの。

編集:

これは、Paolo と Devin の投稿からまとめた、これまでのところ最良の解決策です。

def hexify(num):
    num = "%x" % num

    if len(num) % 2:
        num = '0'+num

    return num.decode('hex')
4

7 に答える 7

6

文字列フォーマットを使用できます:

>>> number = 123456789
>>> hex = "%X" % number
>>> hex
'75BCD15'
于 2009-03-30T22:28:52.447 に答える
5

あなたが何を望んでいるのか正確にはわかりませんが、structモジュールを見ましたか?

与えられた

>>> hex(123456789)
'0x75bcd15'

できるよ:

>>> struct.pack('i', 123456789)
'\x15\xcd[\x07'

注意してください'\x5b' == '['

また、エンディアンを逆にすることもできます:

>>> struct.pack('>i', 123456789)
'\x07[\xcd\x15'

編集:PythonのAFAIK longは無制限であるため(メモリを除いて)、「longよりも大きい」とはどういう意味かわかりません。ただし、分割して連結するだけで、より大きな整数を処理できます。例えば与えられた:

>>> n = 123456789012345678901234567890

ターゲットは次のとおりです。

>>> hex(n)
'0x18ee90ff6c373e0ee4e3f0ad2L'

そう:

>>> s = ''
>>> while n >= 2**32:
...  n, r = divmod(n, 2**32)
...  s = struct.pack('>l', r) + s
... 
>>> s = struct.pack('>l', n) + s

上記の結果とs一致することを確認します。hex(n)

>>> s
'\x00\x00\x00\x01\x8e\xe9\x0f\xf6\xc3s\xe0\xeeN?\n\xd2'
于 2009-03-30T22:47:49.170 に答える
1
'{0:b}'.format( number )

http://docs.python.org/library/string.htmlを参照してください

于 2011-06-03T02:05:45.927 に答える
1

1234567890 を実行すると、機能せず、奇数長の文字列について不平を言うことがあります。

意味がないからです。2 桁または 4 桁のスペースに「AAB」をどのように収めますか? 各バイトは 2 つの 16 進文字です。16 進文字の数が奇数の場合、目的の結果があいまいになります。0AAB または AAB0 と同等にしますか? どちらと同等にするかがわかっている場合は、デコードする前にその文字を適切な場所に追加してください。

つまり(('0' + foo) if len(foo) % 2 else foo).decode('hex')、foo は次の形式の文字列です。%x.

于 2009-03-30T22:31:03.563 に答える
0

任意の数の最も確実な方法の1つは、次のような「配列」モジュールを使用することです。

from array import array
binArr = array('B')

while(data):
    d = data & 0xFF
    binArr.append(d)
    data >>= 8

hexStr = binArr.tostring()
于 2010-06-29T10:23:44.447 に答える
0

Paolo が述べたように、文字列の書式設定が最適です。小文字と大文字のどちらかを選択できることに注意してください。

>>> hex = lambda n: '%X' % n
>>> hex(42)
'2A'
>>> hex = lambda n: '%x' % n
>>> hex(42)
'2a'
>>> def escaped(n):
...     s = hex(n)
...     if len(s) & 1:
...          s = '0' + s
...     return ''.join(chr(int(s[i:i + 2], 16)) for i in range(0, len(s), 2))
...
>>> escaped(123)
'{'
>>> escaped(1234)
'\x04\xd2'
>>> escaped(12348767655764764654764445473245874398787989879879873)
'!\x01^\xa4\xdf\xdd(l\x9c\x00\\\xfa*\xf3\xb4\xc4\x94\x98\xa9\x03x\xc1'

16 進数の桁数が奇数の場合は、エスケープ処理によって先行ゼロが追加されることに注意してください。このソリューションは、任意の長さの文字列に対して機能します。

于 2009-03-30T22:33:40.080 に答える
0

出力文字列の長さがわかっている場合は、文字列の書式設定が機能します。たとえば、4 文字の文字列を取得するには、フォーマットされた長さ 8 が必要です。

>>> "{0:08x}".format(123456789).decode("hex")
'\x07[\xcd\x15'
>>> "{0:08x}".format(1234567890).decode("hex")
'I\x96\x02\xd2'

あなたの番号が文字列を「埋めない」場合、これはゼロを前に追加します。たとえば、6 文字の文字列の場合:

>>> "{0:012x}".format(123456789).decode("hex")
'\x00\x00\x07[\xcd\x15'
>>> "{0:012x}".format(1234567890).decode("hex")
'\x00\x00I\x96\x02\xd2'

編集:

ターゲット文字列の長さを「検出」するには、次のmath.log関数を使用できます。

>>> def int2str(n):
        l = int(math.ceil(math.log(n, 256) / 2) * 4)
        return ("{0:0{1}x}").format(n, l).decode("hex")

>>> int2str(123456789)
'\x07[\xcd\x15'
>>> int2str(1234567890)
'I\x96\x02\xd2'
于 2009-03-30T22:47:32.993 に答える