将n-byte int转换为python3中的字节

时间:2011-01-18 21:15:58

标签: python-3.x

我想将一个32字节(尽管我可能需要其他长度)整数转换为python中的一个字节对象。有一个干净简单的方法吗?

4 个答案:

答案 0 :(得分:8)

to_bytes (length,byteorder [,signed])是从3.2开始所需要的。在这种情况下, someidentifier .to_bytes(4,'big')应该为您提供所需的字节字符串。

答案 1 :(得分:3)

我猜你需要一个32位整数,并且需要big-endian来启动:

>>> from ctypes import c_uint32
>>> l = c_uint32(0x12345678)
>>> bytes(l)
b'xV4\x12'

还有c_uint8,c_uint16和c_uint64。对于更长的整数,您需要使用divmod(x,256)手动创建它。

>>> def bytify(v):
...   v, r = divmod(v, 256)
...   yield r
...   if v == 0:
...      raise StopIteration
...   for r in bytify(v):
...     yield r
... 
>>> [x for x in bytify(0x12345678)]
[120, 86, 52, 18]
>>> bytes(bytify(0x12345678))
b'xV4\x12
>>> bytes(bytify(0x123456789098765432101234567890987654321))
b'!Ce\x87\t\x89gE#\x01!Ce\x87\t\x89gE#\x01'

答案 2 :(得分:2)

您可以直接使用bytes("iterable")iterablebyte中的每个值都将在bytes()中具体>>> var=0x12345678 >>> var_tuple=((var)&0xff, (var>>8)&0xff, (var>>16)&0xff, (var>>24)&0xff) >>> bytes(var_tuple) b'xV4\x12' 。小端编码的示例:

{{1}}

答案 3 :(得分:1)

假设你有

var = 'і' # var is ukrainian і

我们希望从中获取二进制文件。 流就是这样。 value /是string => bytes => int =>二进制

binary_var = '{:b}'.format(int.from_bytes(var.encode('utf-8'), byteorder='big'))

现在binary_var是'1101000110010110'。它的类型是字符串。

现在回过头来,你想从二进制获取unicode值:

int_var = int(binary_var, 2) # here we get int value, int_var = 53654

现在我们需要将整数转换为字节。乌克兰语'它'不适合1个字节而是2个。我们转换为实际字节bytes_var = b'\ xd1 \ x96'

bytes_var = int_var.to_bytes(2, byteorder='big') 

最后我们解码我们的字节。

ukr_i = bytes_var.decode('utf-8') # urk_i = 'і'