如何解决处理已编码一些信息的十六进制数组
我不确定名称是否会误导您,请多多包涵。 因此,基本上,我得到了具有偶数个元素的十六进制数组,如下所示:
DD120134A1A2B3E588
平均len()
约为200。
每两个符号(也称为“字节”)都有一些与之关联的信息,例如DD
是一个前导,它转换为数据包的起始元素。
下一个块12
是软件版本
下一个块0134
是查询号。
下一个块A1
是一个查询类型字段,具有三个可能的值(A1-接受,A2-拒绝,A3-未定义)
等等
我需要做的是将这样的数据包“解码”为文本表,其中包含所有具有相应含义的块:
DD>>>>Packet preamble
12>>>>Version: 18
0134>>Query number: 13313
A1>>>>Query type: accepted
到目前为止,您尝试做什么?
基本上,我创建了约5个以字段值作为键的字典。现在,我对我的代码不满意的是它基本上由成吨的if
和elif
组成,这看起来像是肮脏的代码。另外,由于某些字段本身并没有关联的含义,而应该将其转换为int
值,所以我最终得到了一个字典,该字典以“字节”索引号作为键值,即{ {1}}等,这简直就是错。
在概念上处理此类任务的适当方法是什么?你怎么称呼这样的任务?是解析还是其他? 谢谢!
解决方法
虽然这里可能有更好的方法是我的建议 类数据结构: def init (自己,data_in): self.wrd = data_in @属性 def序言(自己): msk = 0xFF0000000000000000 最接近= 0x10000000000000000 如果(self.wrd&msk)// offst == 0xdd: 返回“数据包序言” 其他: 返回“错误数据包”
@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)]}'
现在提供了输入和类实例化
inp = 0xDD120134A1A2B3E588
p1 = datastruct(inp)
print (f'Preamble: {p1.preamble},Version: {p1.version},Query No: {p1.queryType}')
收益:
序言:数据包序言,版本:版本:18,查询号:接受查询类型
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。