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

ima*_*ett 38 python

我找到的最短路:

n = 5

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

# Python 3.
s = bytes(str(n), "ascii")
i = int(s)
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*den 36

你可以使用struct的包:

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

">"是字节顺序(big-endian),"I"是格式字符.因此,如果您想要做其他事情,您可以具体:

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

In [13]: struct.pack("B", 1)
Out[13]: '\x01'
Run Code Online (Sandbox Code Playgroud)

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

注意:逆操作(字节到int)可以通过解压缩来完成.


Mar*_*som 30

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

s = str(n).encode()
Run Code Online (Sandbox Code Playgroud)

在Python 2中str(n)已经产生了字节; 该encode会是一个双转换与此字符串隐式转换为Unicode,然后再返回到字节.这是不必要的工作,但它是无害的,并且与Python 3完全兼容.


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

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

  • 这对我不起作用.str(0x04).encode()给我'4'.我希望b'\ x04'. (4认同)
  • @Tolli然后你误解了这个问题.目标是生成一个表示数值的字节字符串,而不是字符.我想你正在寻找`chr(n)`. (3认同)

ale*_*ich 14

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

bytes(bytearray([n]))
Run Code Online (Sandbox Code Playgroud)

只有字节([n])在python 2中不起作用.通过bytearray采用风景路径似乎是唯一合理的解决方案.

  • 这不适用于大整数. (4认同)

Nad*_*adu 10

转换的INT字节在Python 3:

    n = 5    
    bytes( [n] )

>>> b'\x05'
Run Code Online (Sandbox Code Playgroud)

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

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


小智 6

从int到byte:

bytes_string = int_v.to_bytes( lenth, endian )
Run Code Online (Sandbox Code Playgroud)

长度是1/2/3/4 ....,而尾数可以是“大”或“小”

将字节形成整数:

data_list = list( bytes );
Run Code Online (Sandbox Code Playgroud)


ret*_*gam 5

在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
Run Code Online (Sandbox Code Playgroud)