Python中的bytearrays数组

时间:2018-02-01 15:10:30

标签: python arrays packing

我有一个包含多个长度字节数组的类,以及一个将它们拼接在一起的创建缓冲区函数:

data

我的问题是:是否可以将所有全局字节数据包装到一个数组中,以便我可以调用

class message():
    msg_hdr_ONE = bytearray(b'\x00')
    msg_hdr_TWO = bytearray(b'\x00')
    msg_hdr_THREE = bytearray(b'\x00\x00')
    msg_hdr_FOUR  = bytearray(b'\x00\x00')

def createBuffer(self):
    self.byteArrays = bytearray()
    self.byteArrays.extend(self.msg_hdr_ONE )
    self.byteArrays.extend(self.msg_hdr_TWO)
    self.byteArrays.extend(self.msg_hdr_THREE )
    self.byteArrays.extend(self.msg_hdr_FOUR  )
    return byteArrays

而不是逐个扩展bytearray。

仅供参考:稍后在我打电话的代码中,例如:

    self.byteArrays.extend(arrayOfBytearrays)

更改类成员变量并通过网络发送数据。

由于

编辑: self。 dict .vales()为我提供了类中保存的正确字节数,但顺序错误。

2 个答案:

答案 0 :(得分:0)

最简单的可能是列表,并添加了b''.join()的所有标题部分:

class Message():
    def __init__(self):
        self.headers = [bytearray(b'\x00'),
                        bytearray(b'\x00'), 
                        bytearray(b'\x00\x00'),
                        bytearray(b'\x00\x00')]

    def createBuffer(self):
        return b''.join(self.headers)

索引从0开始。因此,修改标头THREE中的第一个字节将是索引[2][0]

>>> mymessage = Message()
>>> mymessage.createBuffer()
b'\x00\x00\x00\x00\x00\x00'
>>> mymessage.headers[2][0] = 0x0B
>>> mymessage.createBuffer()
b'\x00\x00\x0b\x00\x00\x00'

答案 1 :(得分:0)

我认为这里最好的方法是在创建缓冲区函数中使用sum或itertools.chain.from_iterable(或者减少,但是它已经完全弃用了):

总和:

import itertools

class Message(object):
    self.msg_hdr_ONE = bytearray(b'\x00')
    self.msg_hdr_TWO = bytearray(b'\x00')
    self.msg_hdr_THREE = bytearray(b'\x00\x00')
    self.msg_hdr_FOUR  = bytearray(b'\x00\x00')

def createBuffer(self):
    byteArrays = bytearray(
        itertools.chain.from_iterable((
            self.msg_hdr_ONE,
            self.msg_hdr_TWO,
            self.msg_hdr_TREE,
            self.msg_hdr_FOUR,

    )))

    return byteArrays

请注意,第二个参数是第一个被sumed的参数,因此不会引发TypeError

使用itertools.chain.from_iterable:

model.NewComment

(我认为' .join()不会在这里工作,因为这些是字节数组,但你应该检查它以确保:))