首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析TLV字符串

解析TLV字符串
EN

Code Review用户
提问于 2020-03-04 18:04:24
回答 1查看 2.3K关注 0票数 2

这段代码应该遍历TLV字符串并打印出其内容。对于这个特殊的例子,标签字段长度为2,大小字段长度为3。

作为一个主要是C程序员,这就是我想出来的。我知道我可以参数化标签和长度字段大小,但我现在不关心这个。我只想知道更多的弦乐解析方法。

代码语言:javascript
复制
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:]
EN

回答 1

Code Review用户

回答已采纳

发布于 2020-03-05 10:14:15

一些初步意见:

  • 很好地使用字符串切片来提取每个字段,但理想情况下,我们不需要复制字符串。我在下面提出了一种不同的做法。
  • while len(temp):可以工作,但是一种更为毕加索式的写作方式是while temp:,因为任何对象都可以在Python中测试真值,而非空字符串的计算结果为真。
  • Python3.6中引入的一种流行的字符串插值方法是F-弦。所以,与'tag: {}'.format(temp[0:2])不同,您可以使用f'tag: {temp[0:2]}',我个人认为它更容易阅读。

为了避免复制字符串tlv,我们可以使用迭代器对字符串中的字符进行迭代,即iter(tlv)。然后,我们可以使用itertools,这是一个很好的内置库,用于使用迭代器,特别是itertools.islice,从迭代器中提取/使用任意长度的块:

代码语言:javascript
复制
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成为一个由(标记、长度、值)组成的三元组的生成器

示例用法:

代码语言:javascript
复制
>>> 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'
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/238377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档