这不是 pascal/delphi 字符串格式,因为它们是常量 1 字节或 4 字节长的长度字段。
它确实与 ASN1 格式有一些相似之处,只是 ASN1 带有一个额外的字段,表示对象的类型。
无论如何,这看起来像第一个字节的最高有效位不是长度的一部分,并且具有通过附加字节扩展长度的特殊含义。
如果你拿那张桌子:
In [24]: t
Out[24]:
[['7D', 'N/A', '126'],
['7E', 'N/A', '127'],
['7F', 'N/A', '128'],
['80', '01', '129'],
['81', '01', '130'],
['C7', '01', '200'],
['C8', '01', '201'],
['F9', '01', '250'],
['FE', '01', '255'],
['FF', '01', '256'],
['80', '02', '257'],
['81', '02', '258'],
['82', '02', '259'],
['F3', '03', '500'],
['F4', '03', '501'],
['F5', '03', '502'],
['F6', '03', '503'],
['80', '04', '513']]
并将 MSB 从第一个字节中分离出来:
In [36]: t2=[[int(l[0], 16)&0b10000000>0, hex(int(l[0], 16)&0b01111111)[2:]]+l[1:] for l in t]
In [37]: t2
Out[37]:
[[False, '7d', 'N/A', '126'],
[False, '7e', 'N/A', '127'],
[False, '7f', 'N/A', '128'],
[True, '0', '01', '129'],
[True, '1', '01', '130'],
[True, '47', '01', '200'],
[True, '48', '01', '201'],
[True, '79', '01', '250'],
[True, '7e', '01', '255'],
[True, '7f', '01', '256'],
[True, '0', '02', '257'],
[True, '1', '02', '258'],
[True, '2', '02', '259'],
[True, '73', '03', '500'],
[True, '74', '03', '501'],
[True, '75', '03', '502'],
[True, '76', '03', '503'],
[True, '0', '04', '513']]
首先,让我们注意0x7D十进制是 125,而不是 126。对于 MSB 清晰的所有值都是如此,因此所有这些值总是加 1。
然后,如果设置了 MSB,则将第二个字节中的值乘以 128,然后添加到第一个字节的结果中。
这是一个使用前两个字节计算结果的示例(并将其附加为最后一个值:
In [53]: t3 = [l+[int(l[1], 16) + 1 + (int(l[2], 16)*128 if l[0] else 0)] for l in t2]
In [54]: t3
Out[54]:
[[False, '7d', 'N/A', '126', 126],
[False, '7e', 'N/A', '127', 127],
[False, '7f', 'N/A', '128', 128],
[True, '0', '01', '129', 129],
[True, '1', '01', '130', 130],
[True, '47', '01', '200', 200],
[True, '48', '01', '201', 201],
[True, '79', '01', '250', 250],
[True, '7e', '01', '255', 255],
[True, '7f', '01', '256', 256],
[True, '0', '02', '257', 257],
[True, '1', '02', '258', 258],
[True, '2', '02', '259', 259],
[True, '73', '03', '500', 500],
[True, '74', '03', '501', 501],
[True, '75', '03', '502', 502],
[True, '76', '03', '503', 503],
[True, '0', '04', '513', 513]]
上面做计算的代码不是很漂亮,所以这里有一个简短的python函数,它做同样的事情:
def calc(first_byte, second_byte):
value = 1
value += first_byte & 0x7F
msb = bool(first_byte >> 7)
if msb:
value += second_byte * 128
另一种可能更直观的方式是,第二个字节是第一个字节的 7 位(不包括 MSB)的延续。这是一个基于该方法进行相同计算的函数:
def calc(first_byte, second_byte):
value = 1
value += first_byte & 0x7F
msb = bool(first_byte >> 7)
if msb:
value += second_byte << 7
我们缺少在第二个字节上设置 MSB 的任何值,但这种方法可能是顺序的,通过设置所有先前字节的 MSB,允许使用更多字节来扩大范围。