我需要使用原始二进制数据构建一个tcp帧,但是我发现所有关于字节的示例和教程总是涉及从字符串转换,而这不是我需要的。
简而言之,我只需要构建一个字节数组:
0xA2 0x01 0x02 0x03 0x04
请注意,我来自C / C ++世界。
我试过这个:
frame = b""
frame += bytes( int('0xA2',16) )
frame += bytes( int('0x01',16) )
frame += bytes( int('0x02',16) )
frame += bytes( int('0x03',16) )
frame += bytes( int('0x04',16) )
然后,抛出这个frame变量来发送socket的方法,但是没有按预期工作,因为frame不包含我想要的...
我知道这是关于Python的一个非常基本的问题,所以如果你能指出我正确的方向......
答案 0 :(得分:44)
使用bytearray
:
>>> frame = bytearray()
>>> frame.append(0xA2)
>>> frame.append(0x01)
>>> frame.append(0x02)
>>> frame.append(0x03)
>>> frame.append(0x04)
>>> frame
bytearray(b'\xa2\x01\x02\x03\x04')
或者,使用您的代码但修复错误:
frame = b""
frame += b'\xA2'
frame += b'\x01'
frame += b'\x02'
frame += b'\x03'
frame += b'\x04'
答案 1 :(得分:13)
如何简单地从标准列表构建框架呢?
frame = bytes([0xA2,0x01,0x02,0x03,0x04])
bytes()
构造函数可以从包含int
值的iterable构建一个字节帧。一个iterable是实现迭代器协议的任何东西:一个列表,一个迭代器,一个像range()
返回的可迭代对象......
答案 2 :(得分:6)
frame = b'\xa2\x01\x02\x03\x04'
到目前为止还没有提到......
答案 3 :(得分:4)
agf的bytearray解决方案是可行的,但如果您发现自己需要使用除字节以外的数据类型来构建更复杂的数据包,则可以尝试struct.pack()
。 http://docs.python.org/release/3.1.3/library/struct.html
答案 4 :(得分:0)
以下是获取字节数组(列表)的解决方案:
我发现您需要先将Int转换为字节,然后再将其传递给bytes():
bytes(int('0xA2', 16).to_bytes(1, "big"))
然后从字节创建一个列表:
list(frame)
因此您的代码应如下所示:
frame = b""
frame += bytes(int('0xA2', 16).to_bytes(1, "big"))
frame += bytes(int('0x01', 16).to_bytes(1, "big"))
frame += bytes(int('0x02', 16).to_bytes(1, "big"))
frame += bytes(int('0x03', 16).to_bytes(1, "big"))
frame += bytes(int('0x04', 16).to_bytes(1, "big"))
bytesList = list(frame)
问题在于字节数组(列表)。您接受了一个不会告诉您如何获得列表的答案,因此我不确定这是否真的是您所需要的。
答案 5 :(得分:-1)