簡體   English   中英

將數字轉換為二進制字符串

[英]Convert number to binary string

這是將Python編號轉換為十六進制字符串的最佳方法嗎?

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

當你做1234567890時,有時它不起作用並抱怨奇數字符串。

澄清:

我將從int轉到hex。

此外,我需要它逃脫。

IE:1234567890 - >'\\ x49 \\ x96 \\ x02 \\ xd2'不是'499602D2'

此外,它需要能夠采用任何Python整數。 IE瀏覽器。 比Int更大的東西。

編輯:

這是迄今為止我從Paolo和Devin的帖子拼湊而成的最佳解決方案。

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

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

    return num.decode('hex')

您可以使用字符串格式

>>> number = 123456789
>>> hex = "%X" % number
>>> hex
'75BCD15'

我不確定你想要什么,但是你看過struct模塊了嗎?

特定

>>> hex(123456789)
'0x75bcd15'

你可以做:

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

請注意'\\x5b' == '['

此外,您可以反轉字節順序:

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

編輯:我不確定你的意思是“大於長”,因為AFAIK在python中的長度是無限的(除了記憶)。 但是,您可以通過分割和連接來處理更大的整數。 例如:

>>> 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'
'{0:b}'.format( number )

請參閱http://docs.python.org/library/string.html

當你做1234567890時,有時它不起作用並抱怨奇數字符串。

因為它沒有意義。 你如何在一個2或4位數的空間中安裝'AAB'? 每個字節是兩個十六進制字符。 當您有一個奇數個十六進制字符時,所需的結果是不明確的。 你想要它相當於0AAB或AAB0嗎? 如果你知道你希望它與哪一個相同,那么只需在解碼前將該字符添加到正確的位置即可。

ie (('0' + foo) if len(foo) % 2 else foo).decode('hex')其中foo是%x.返回的表單的字符串%x.

對於任意數字,最可靠的方法之一就是像這樣使用'array'模塊:

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

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

hexStr = binArr.tostring()

正如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'

請注意,在奇數個十六進制數字的情況下, 轉義會添加前導零。 此解決方案適用於任何長度的字符串。

如果您知道輸出字符串應該有多長,字符串格式化將起作用。 例如,要獲得四個字符的字符串,您需要格式化長度為8:

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

如果您的號碼沒有“填滿”字符串,這將前置零。 例如,使用六個字符的字符串:

>>> "{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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM