40

我发现的最短方法是:

n = 5

# Python 2.
s = str(n)
i = int(s)

# Python 3.
s = bytes(str(n), "ascii")
i = int(s)

我特别关心两个因素:可读性和可移植性。对于 Python 3,第二种方法很难看。但是,我认为它可能是向后兼容的。

有没有我错过的更短,更清洁的方式?我目前制作了一个 lambda 表达式来用一个新函数修复它,但也许这是不必要的。

4

6 回答 6

42

答案1:

要在 Python 2 或 Python 3 中将字符串转换为字节序列,请使用字符串的encode方法。如果您不提供使用编码参数'ascii',这对于数字数字来说总是足够好的。

s = str(n).encode()

在 Python 2str(n)中已经产生了字节;将encode进行双重转换,因为此字符串被隐式转换为 Unicode 并再次转换回字节。这是不必要的工作,但它是无害的,并且与 Python 3 完全兼容。


答案 2:

以上是实际提出的问题的答案,即以人类可读的形式生成一串 ASCII 字节。但由于人们不断来到这里试图获得不同问题的答案,我也会回答这个问题。如果您想转换10b'10'使用上面的答案,但如果您想转换10b'\x0a\x00\x00\x00',请继续阅读。

struct模块专门用于在各种类型及其作为字节序列的二进制表示之间进行转换。从类型到字节的转换是用struct.pack. 有一个格式参数fmt决定它应该执行哪种转换。对于 4 字节整数,这将i用于有符号数或I无符号数。有关更多可能性,请参阅格式字符表,并在输出多于一个字节时查看字节顺序、大小和对齐表以获取选项。

import struct
s = struct.pack('<i', 5) # b'\x05\x00\x00\x00'
于 2012-12-26T18:13:19.127 回答
39

您可以使用结构的 pack

In [11]: struct.pack(">I", 1)
Out[11]: '\x00\x00\x00\x01'

“>”是字节顺序(大端),“I”是格式字符。因此,如果您想做其他事情,您可以具体说明:

In [12]: struct.pack("<H", 1)
Out[12]: '\x01\x00'

In [13]: struct.pack("B", 1)
Out[13]: '\x01'

这在 python 2 和python 3上都是一样的。

注意:逆运算(字节到 int)可以用unpack完成。

于 2014-11-14T00:26:19.443 回答
16

我找到了唯一可靠、便携的方法

bytes(bytearray([n]))

只是 bytes([n]) 在 python 2 中不起作用。通过 bytearray 走风景路线似乎是唯一合理的解决方案。

于 2015-03-21T11:41:30.733 回答
10

在 Python 3中将int转换为字节

    n = 5    
    bytes( [n] )

>>> b'\x05'

;) 猜这会比乱搞字符串要好

来源:http ://docs.python.org/3/library/stdtypes.html#binaryseq

于 2014-02-27T16:26:07.040 回答
7

从整数到字节:

bytes_string = int_v.to_bytes( lenth, endian )

其中 lenth 是 1/2/3/4....,endian 可以是“大”或“小”

将字节格式转换为 int:

data_list = list( bytes );
于 2017-06-21T10:14:53.297 回答
6

在 Python 3.x 中,您可以将整数值(包括其他答案不允许的大值)转换为一系列字节,如下所示:

import math

x = 0x1234
number_of_bytes = int(math.ceil(x.bit_length() / 8))

x_bytes = x.to_bytes(number_of_bytes, byteorder='big')

x_int = int.from_bytes(x_bytes, byteorder='big')
x == x_int
于 2018-07-20T16:29:24.320 回答