这段代码应该遍历TLV字符串并打印出其内容。对于这个特殊的例子,标签字段长度为2,大小字段长度为3。
作为一个主要是C程序员,这就是我想出来的。我知道我可以参数化标签和长度字段大小,但我现在不关心这个。我只想知道更多的弦乐解析方法。
tlv = "01011Lorem ipsum02014dolor sit amet03027consectetur adipiscing elit"
temp = tlv[:]
while len(temp):
print('tag: {}'.format(temp[0:2]))
print('length: {}'.format(temp[2:2+3]))
tam = int(temp[2:2+3])
print('value: \'{}\'\n'.format(temp[5:5+tam]))
temp = temp[5+tam:]发布于 2020-03-05 10:14:15
一些初步意见:
while len(temp):可以工作,但是一种更为毕加索式的写作方式是while temp:,因为任何对象都可以在Python中测试真值,而非空字符串的计算结果为真。。'tag: {}'.format(temp[0:2])不同,您可以使用f'tag: {temp[0:2]}',我个人认为它更容易阅读。为了避免复制字符串tlv,我们可以使用迭代器对字符串中的字符进行迭代,即iter(tlv)。然后,我们可以使用itertools,这是一个很好的内置库,用于使用迭代器,特别是itertools.islice,从迭代器中提取/使用任意长度的块:
from itertools import islice
TAG_FIELD_LENGTH = 2
LENGTH_FIELD_LENGTH = 3
def tlv_parser(tlv_string):
it = iter(tlv_string)
while tag := "".join(islice(it, TAG_FIELD_LENGTH)):
length = int("".join(islice(it, LENGTH_FIELD_LENGTH)))
value = "".join(islice(it, length))
yield (tag, length, value)关于上述事项的说明:
"".join(...) (即str.join )连接到一个字符串中。:=是“海象操作员” (在Python3.8中引入的),它将值绑定到变量,作为更大表达式的一部分,因此我们将"".join(islice(it, TAG_FIELD_LENGTH))的值绑定到tag,同时测试其真值。yield关键字使tlv_parser成为一个由(标记、长度、值)组成的三元组的生成器。示例用法:
>>> tlv = "01011Lorem ipsum02014dolor sit amet03027consectetur adipiscing elit"
>>> for t in tlv_parser(tlv):
... print(t)
...
('01', 11, 'Lorem ipsum')
('02', 14, 'dolor sit amet')
('03', 27, 'consectetur adipiscing elit')
>>> for tag, length, value in tlv_parser(tlv):
... print(f"tag: {tag}")
... print(f"length: {length}")
... print(f"value: {value!r}\n")
...
tag: 01
length: 11
value: 'Lorem ipsum'
tag: 02
length: 14
value: 'dolor sit amet'
tag: 03
length: 27
value: 'consectetur adipiscing elit'https://codereview.stackexchange.com/questions/238377
复制相似问题