处理已编码信息的十六进制数组

Processing hex-arrays which have got some information encoded

我不确定这个名字是否具有误导性,所以请多多包涵。 所以,基本上我得到的十六进制数组具有偶数个元素,如下所示:

DD120134A1A2B3E588

平均 len() 约为 200。 每两个符号 'bytes' 都有一些与之相关的信息,例如,DD 是一个前导码,可以翻译为数据包起始元素。 下一个块12是软件版本 下一个块 0134 是一个查询号码。 下一个块 A1 是一个查询类型字段,它具有三个可能的值(A1 - 接受,A2 - 拒绝,A3 - 未定义) 等等

我需要做的是'decode'把这样一个数据包变成一个文本table,所有的块都有相应的含义:

DD>>>>Packet preamble
12>>>>Version: 18
0134>>Query number: 13313
A1>>>>Query type: accepted

What have you tried to do so far?

基本上,我创建了大约 5 个以字段值作为键的字典。现在,我不喜欢我的代码的地方在于它基本上由大量的 ifelif 组成,这看起来像是脏代码。此外,由于某些字段本身没有相关含义,而应该只是转换为 int 值,因此我最终得到了一个以 'byte' 索引号作为键值的字典,即 1: preamble 等,感觉不对。

处理此类任务在概念上合适的方法是什么?你怎么称呼这样的任务?它是解析还是其他? 谢谢!

虽然这里可能有更好的方法,但我的建议是 class 数据结构: def init(self, data_in): self.wrd = data_in @属性 def序言(自我): msk = 0xFF0000000000000000 偏移量 = 0x10000000000000000 if (self.wrd & msk)//offst == 0xdd: return 'Packet Preamble' 别的: return'Bad Packet'

@property
def version(self):
    msk = 0x00FF00000000000000
    offst = 0x100000000000000
    return f'Version: {(self.wrd & msk)//offst}'

@property
def queryNo(self):
    msk =  0x0000FFFF0000000000
    offst = 0x1000000000 
    return f'Query No: {hex((self.wrd & msk)//offst)}'

@property
def queryType(self):
    qryTypes = {'0xa1':'accepted', '0xa2':'denied','0xa3':'undefined'}
    msk = 0x00000000FF00000000
    offst = 0x100000000 
    qt = hex((self.wrd&msk)//offst)
    return f'Query type {qryTypes[str(qt)]}'

现在给定输入和 class 实例化

inp = 0xDD120134A1A2B3E588
p1 = datastruct(inp)
print (f'Preamble: {p1.preamble}, Version: {p1.version}, Query No: {p1.queryType}')
     

产量:

Preamble: Packet Preamble, Version: Version: 18, Query No: Query type accepted