我找到的最短路:
n = 5
#Python 2
s = str(n)
i = int(s)
#Python 3
s = bytes(str(n),"ascii")
i = int(s)
我特别关注两个因素:可读性和可移植性。对于Python 3,第二种方法很难看。但是,我认为它可能是向后兼容的。
我错过了一种更简洁,更清洁的方式吗?我目前使用一个新函数修改一个lambda表达式,但也许这是不必要的。
答案 0 :(得分:35)
您可以使用struct's pack:
In [11]: struct.pack(">I", 1)
Out[11]: '\x00\x00\x00\x01'
">"是byte-order (big-endian)和"我"是format character。因此,如果您想要做其他事情,您可以具体:
In [12]: struct.pack("<H", 1)
Out[12]: '\x01\x00'
In [13]: struct.pack("B", 1)
Out[13]: '\x01'
这在python 2和python 3上都是一样的。
注意:可以使用unpack完成逆操作(字节到int)。
答案 1 :(得分:27)
要在Python 2或Python 3中将字符串转换为字节序列,请使用字符串的encode
方法。如果您不提供编码参数,则使用'ascii'
,这对于数字数字总是足够好。
s = str(n).encode()
在Python 2中str(n)
已生成字节; encode
将执行双重转换,因为此字符串被隐式转换为Unicode并再次返回到字节。这是不必要的工作,但它是无害的,并且与Python 3完全兼容。
10
转换为b'10'
,请使用上面的答案,但如果您想将10
转换为b'\x0a\x00\x00\x00'
,请继续阅读。
struct
module专门用于在各种类型之间进行转换,并将其二进制表示形式转换为字节序列。从类型到字节的转换是使用struct.pack
完成的。有一个格式参数fmt
,用于确定应执行的转换。对于4字节整数,对于有符号数字,i
或对于无符号数字,I
。有关更多可能性,请参阅format character table,并在输出超过单个字节时查看byte order, size, and alignment table选项。
答案 2 :(得分:15)
我找到了唯一可靠,便携的方法
bytes(bytearray([n]))
只有字节([n])在python 2中不起作用。通过bytearray采用风景路径似乎是唯一合理的解决方案。
答案 3 :(得分:10)
在Python 3 中将 int 转换为字节:
n = 5
bytes( [n] )
>>> b'\x05'
;)猜测这会比搞乱字符串更好
答案 4 :(得分:4)
从int到byte:
describe DR$cat_index$I
其中lenth是1/2/3/4 ...., endian可能是'big'或'little'
将字节格式化为int:
bytes_string = int_v.to_bytes( lenth, endian )
答案 5 :(得分:3)
在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