将数字转换为二进制字符串

发布于 2024-07-17 01:26:21 字数 557 浏览 3 评论 0原文

这是将 Python 数字转换为十六进制字符串的最佳方法吗?

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

有时,当您执行 1234567890 时,它不起作用并抱怨奇数长度字符串。

澄清:

我将从整数转换为十六进制。

另外,我需要它被逃脱。

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')

Is this the best way to convert a Python number to a hex string?

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

Sometimes it doesn't work and complains about Odd-length string when you do 1234567890.

Clarification:

I am going from int to hex.

Also, I need it to be escaped.

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

Also, it needs to be able to take any Python integer. IE. something larger than an Int.

Edit:

Here is the best solution so far I have cobbled together from Paolo and Devin's post.

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

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

    return num.decode('hex')

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

看春风乍起 2024-07-24 01:26:21

您可以使用字符串格式

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

You can use string formatting:

>>> number = 123456789
>>> hex = "%X" % number
>>> hex
'75BCD15'
仅此而已 2024-07-24 01:26:21

我不确定你到底想要什么,但是你看过 struct模块?

鉴于

>>> hex(123456789)
'0x75bcd15'

您可以执行以下操作:

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

请注意 '\x5b' == '['

另外,你可以反转字节顺序:

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

编辑:我不确定你所说的“大于长”是什么意思,因为据我所知,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'

I'm not sure exactly what you want, but have you looked at the struct module?

Given

>>> hex(123456789)
'0x75bcd15'

You can do:

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

Note that '\x5b' == '['.

Also, you can reverse the endianness:

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

Edit: I'm not sure what you mean by "bigger than a long", since AFAIK longs in python are unbounded (except by memory). However, you can deal with bigger integers by just dividing and concatenating. e.g. given:

>>> n = 123456789012345678901234567890

the target is:

>>> hex(n)
'0x18ee90ff6c373e0ee4e3f0ad2L'

So:

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

See that s matches the result of hex(n) above:

>>> s
'\x00\x00\x00\x01\x8e\xe9\x0f\xf6\xc3s\xe0\xeeN?\n\xd2'
下雨或天晴 2024-07-24 01:26:21

有时,当您执行 1234567890 时,它不起作用并抱怨奇数长度字符串。

因为它没有意义。 如何将“AAB”放入 2 或 4 位数字的空格中? 每个字节是两个十六进制字符。 当十六进制字符数为奇数时,所需的结果是不明确的。 您希望它相当于 0AAB 还是 AAB0? 如果您知道希望它等同于哪个字符,只需在解码之前将该字符添加到正确的位置即可。

(('0' + foo) if len(foo) % 2 else foo).decode('hex') 其中 foo 是 %x.< 返回形式的字符串。 /代码>

Sometimes it doesn't work and complains about Odd-length string when you do 1234567890.

Because it doesn't make sense. How do you fit 'AAB' in a space that takes either 2 or 4 digits? Each byte is two hex characters. When you have an odd number of hex characters, the desired result is ambiguous. Do you want it to be the equivalent of 0AAB or AAB0? If you know which one you want it to be equivalent to, just add that character to the right place before decoding.

i.e. (('0' + foo) if len(foo) % 2 else foo).decode('hex') where foo is a string of the form returned by %x.

惜醉颜 2024-07-24 01:26:21
'{0:b}'.format( number )

参考http://docs.python.org/library/string.html

'{0:b}'.format( number )

refer to http://docs.python.org/library/string.html

↘人皮目录ツ 2024-07-24 01:26:21

如果您知道输出字符串应该有多长,则可以进行字符串格式化。 例如,要获取四个字符的字符串,您需要将格式化长度设置为八:

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

If you know how long your output strings should be, string formatting will work. For example, to get four-character strings, you need a formatted length of eight:

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

This will prepend zeroes if your number doesn't "fill up" the string. For example, with six-character strings:

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

Edit:

To "detect" the length of target strings, you can use the math.log function:

>>> 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'
梦冥 2024-07-24 01:26:21

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

请注意,转义会在十六进制数字为奇数的情况下添加前导零。 该解决方案适用于任何长度的字符串。

As Paolo mentioned, string formatting is the way to go. Note that you can choose between lower and upper case letters:

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

Note that escaped adds a leading zero in case of an odd number of hex digits. This solution works for strings of any length.

浅语花开 2024-07-24 01:26:21

对于任意数字,最可靠的方法之一是使用“array”模块,如下所示:

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

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

hexStr = binArr.tostring()

one of the surest way, for arbitary numbers, is to use the 'array' module like this:

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

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

hexStr = binArr.tostring()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文