处理已编码信息的十六进制数组
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 个以字段值作为键的字典。现在,我不喜欢我的代码的地方在于它基本上由大量的 if
和 elif
组成,这看起来像是脏代码。此外,由于某些字段本身没有相关含义,而应该只是转换为 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
我不确定这个名字是否具有误导性,所以请多多包涵。 所以,基本上我得到的十六进制数组具有偶数个元素,如下所示:
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 个以字段值作为键的字典。现在,我不喜欢我的代码的地方在于它基本上由大量的 if
和 elif
组成,这看起来像是脏代码。此外,由于某些字段本身没有相关含义,而应该只是转换为 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