我想将一个32字节(尽管我可能需要其他长度)整数转换为python中的一个字节对象。有一个干净简单的方法吗?
答案 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")
。 iterable
中byte
中的每个值都将在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 = 'і'