【问题标题】:Array of bytearrays in PythonPython中的字节数组数组
【发布时间】:2018-02-01 15:10:30
【问题描述】:

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

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

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

    self.byteArrays.extend(arrayOfBytearrays)

而不是一一扩展字节数组。

仅供参考:稍后在我调用的代码中,例如:

 myMessage.msg_hdr_THREE[1] = 0x0B
 myMessage.createBuffer()

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

谢谢

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

【问题讨论】:

    标签: python arrays packing


    【解决方案1】:

    最简单的可能是一个列表,并用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'
    

    【讨论】:

    • 感谢您的回答。然而,消息非常长(500 -600)字节,因此例如使用 mymessage.headers[152][3] 并没有真正向班级用户提供任何指示他正在编辑什么。出于这个原因,我想保留命名约定 objectName.memberVariableName
    • 您希望[152][2] 看起来如何,msg_hdr_HUNDREDFIFTYONE[4]
    【解决方案2】:

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

    总和:

    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(
            sum((
                self.msg_hdr_ONE,
                self.msg_hdr_TWO,
                self.msg_hdr_TREE,
                self.msg_hdr_FOUR,
    
            ),
            bytearray()
        ))
    
        return byteArrays 
    

    注意第二个参数是第一个要求和的参数,所以不会引发 TypeError

    使用 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
    

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

    【讨论】:

    • 感谢您的回答,但在这两种情况下,您仍然必须一次打包缓冲区一个成员变量。我正在寻找一种在一行中执行此操作的方法,以便仅在消息类中添加新消息字段,而 createBuffer 将所有内容打包在消息类中
    猜你喜欢
    • 2011-11-14
    • 2018-03-02
    • 2017-10-02
    • 2011-07-02
    • 2010-12-16
    • 1970-01-01
    • 2017-05-31
    • 2021-07-05
    相关资源
    最近更新 更多