Python 2,3干净地将整数转换为“字节”

时间:2012-12-26 17:22:28

标签: python

我找到的最短路:

n = 5

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

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

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

我错过了一种更简洁,更清洁的方式吗?我目前使用一个新函数修改一个lambda表达式,但也许这是不必要的。

6 个答案:

答案 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完全兼容。

<小时/> 以上是实际问题的答案,即生成一串ASCII字节。但是,由于人们不断来到这里试图得到不同的问题的答案,我也会回答这个问题。如果您想将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'

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

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

答案 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