Python 3构建一个字节数组

时间:2020-12-14 18:10:28

I need to build a tcp frame with raw binary data, but all examples and tutorials I've found talking about bytes always involve conversion from a string, and that's not what I need.

我需要用原始的二进制数据构建一个tcp框架,但是我发现讨论字节的所有示例和教程都涉及到从字符串转换,这不是我需要的。

In short, I need to build just an array of bytes:

简而言之,我需要构建一个字节数组:

0xA2 0x01 0x02 0x03 0x04

0xA2 0x01 0x02 0x03 0x04

Please note that I come from C/C++ world.

请注意,我来自C/ c++世界。

I've tried this:

我已经试过这个:

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) )

Then, throw this frame variable to send method of socket, but not working as expected as frame doesn't contain what I want...

然后,抛出这个frame变量来发送socket方法,但是不能正常工作,因为frame不包含我想要的……

I know this is a very basic question about Python, so if you could point me in the right direction...

我知道这是一个关于Python的非常基本的问题,所以如果你能给我指出正确的方向……

5 个解决方案

#1


30  

Use a bytearray:

使用中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')

or, using your code but fixing the errors:

或者,使用你的代码但修复错误:

frame = b""
frame += b'\xA2' 
frame += b'\x01' 
frame += b'\x02' 
frame += b'\x03'
frame += b'\x04'

#2


11  

what about simply constructing your frame from a standard list ?

那么简单地从标准列表中构建框架呢?

frame = bytes([0xA2,0x01,0x02,0x03,0x04])

the bytes() constructor can build a byte frame from an iterable containing int values. an iterable is anything which implements the iterator protocol: an list, an iterator, an iterable object like what is returned by range()...

bytes()构造函数可以从一个包含int值的可迭代的字节帧中构建一个字节帧。iterable是实现迭代器协议的任何东西:列表、迭代器、可迭代对象,比如range()返回的对象……

#3


6  

frame = b'\xa2\x01\x02\x03\x04'

wasn't mentionned till now...

没有提及到现在…

#4


3  

agf's bytearray solution is workable, but if you find yourself needing to build up more complicated packets using datatypes other than bytes, you can try struct.pack(). http://docs.python.org/release/3.1.3/library/struct.html

agf的bytearray解决方案是可行的,但是如果您发现需要使用非字节的数据类型构建更复杂的数据包,可以尝试struct.pack()。http://docs.python.org/release/3.1.3/library/struct.html

#5


-1  

I think Scapy is what are you looking for.

我觉得你要找的就是Scapy。

http://www.secdev.org/projects/scapy/

http://www.secdev.org/projects/scapy/

you can build and send frames (packets) with it

您可以使用它构建和发送帧(包)

#1


30  

Use a bytearray:

使用中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')

or, using your code but fixing the errors:

或者,使用你的代码但修复错误:

frame = b""
frame += b'\xA2' 
frame += b'\x01' 
frame += b'\x02' 
frame += b'\x03'
frame += b'\x04'

#2


11  

what about simply constructing your frame from a standard list ?

那么简单地从标准列表中构建框架呢?

frame = bytes([0xA2,0x01,0x02,0x03,0x04])

the bytes() constructor can build a byte frame from an iterable containing int values. an iterable is anything which implements the iterator protocol: an list, an iterator, an iterable object like what is returned by range()...

bytes()构造函数可以从一个包含int值的可迭代的字节帧中构建一个字节帧。iterable是实现迭代器协议的任何东西:列表、迭代器、可迭代对象,比如range()返回的对象……

#3


6  

frame = b'\xa2\x01\x02\x03\x04'

wasn't mentionned till now...

没有提及到现在…

#4


3  

agf's bytearray solution is workable, but if you find yourself needing to build up more complicated packets using datatypes other than bytes, you can try struct.pack(). http://docs.python.org/release/3.1.3/library/struct.html

agf的bytearray解决方案是可行的,但是如果您发现需要使用非字节的数据类型构建更复杂的数据包,可以尝试struct.pack()。http://docs.python.org/release/3.1.3/library/struct.html

#5


-1  

I think Scapy is what are you looking for.

我觉得你要找的就是Scapy。

http://www.secdev.org/projects/scapy/

http://www.secdev.org/projects/scapy/

you can build and send frames (packets) with it

您可以使用它构建和发送帧(包)