python asn1将文本解析为json

2024-04-28 19:53:12 发布

您现在位置:Python中文网/ 问答频道 /正文

在这个link中给出的文本中,需要提取以下数据

  1. 每个记录以^{cd1>}开头,例如2019年8月31日09:17:36.550
  2. 每个记录都有一个标题,从上面的第1行开始,以一行为结尾
  3. 记录数据包含在^{cd2>}下面的行中
  4. 感兴趣的记录是记录头第一行具有^{{cd3>}的记录

是否可以将上面ා3以下的选定记录头和文本提取为嵌套json数组,格式如下所示-为简洁起见,需要将整个文本数据作为json。

data = [{"time": "2019 Aug 31  09:17:36.550", "PDU Number": "RRC_RECONFIG Message", "Physical Cell ID": 0, "rrc-TransactionIdentifier": 1, "criticalExtensions rrcReconfiguration": {"secondaryCellGroup": {"cellGroupId": 1, "rlc-BearerToAddModList": [{"logicalChannelIdentity": 1, "servedRadioBearer drb-Identity": 2, "rlc-Config am": {"ul-AM-RLC": {"sn-FieldLength": "size18", "t-PollRetransmit": "ms40", "pollPDU": "p32", "pollByte": "kB25", "maxRetxThreshold": "t32"}, "dl-AM-RLC": {"sn-FieldLength": "size18", "t-Reassembly": "ms40", "t-StatusProhibit": "ms20"}}}]}}  }, next records data here]

注意,输入文本是在3GPP38.331第6.3.2节中解析ASN1数据规范的输出。我不确定普通的python文本解析是正确的方法来处理这个问题,还是应该使用asn1tools库之类的方法?如果是这样,那么对该数据的示例使用将很有帮助。


Tags: 数据方法文本jsondata记录linkam
2条回答

假设您有输入数据的文本表示,您可以看看parse库。这允许您在字符串中查找模式并将内容分配给变量。在

以下是提取时间、PDU编号和物理单元ID数据字段的示例:

import parse

with open('w9s2MJK4.txt', 'r') as f:
  input = f.read()

data = []
pattern = parse.compile('\n{year:d} {month:w} {day:d}  {hour:d}:{min:d}:{sec:d}.{ms:d}{}Physical Cell ID = {pcid:d}{}PDU Number = {pdu:w} {pdutype:w}')

for s in pattern.findall(input):
  record = {}
  record['time'] = '{} {} {} {:02d}:{:02d}:{:02d}.{:03d}'.format(s.named['year'], s.named['month'], s.named['day'], s.named['hour'], s.named['min'], s.named['sec'], s.named['ms'])
  record['PDU Number'] = '{} {}'.format(s.named['pdu'], s.named['pdutype'])
  record['Physical Cell ID'] = s.named['pcid']
  data.append(record)

由于您有一个相当复杂的结构和大量的数据字段,这可能会变得有点麻烦,但我个人更喜欢这种方法而不是正则表达式。也许还有一种更聪明的方法来解析日期(不幸的是,它似乎没有库支持的标准格式之一)。在

不幸的是,不太可能有人直接回答您的问题(这与How to extract data from asn1 data file and load it into a dataframe?非常相似)

链接的文本显然是一个日志文件,其中使用了ASN.1值表示法使消息可读。因此,尝试从文本形式解码这些消息是不寻常的,您可能找不到相应的工具。在

理论上,一般的方法是:

  1. 收集用于创建ASN.1消息的ASN.1定义(架构)
  2. 使用ASN.1工具(又名编译器)编译这些定义,以生成您最喜欢的语言(python)的对象模型。该工具将提供具体的编码和解码。。。你可以使用ASN.1值解码器。在
  3. 添加自定义代码(添加到对象模型或插入ASN.1编译器)以对JSON对象进行编码

正如你所见,这是一个很长的机会(如果这个解释太短或不清楚,我可以扩展)

除非您的任务是重复的和/或消息的数量很大,否则请尝试您已经知道的方法(手动搜索,regex)来搜索日志文件。在

如果你想知道创建ASN.1工具需要什么,你可以找到一些(不是那么多,因为ASN.1并不特别年轻和流行)。签出https://github.com/etingof/pyasn1(python)

我在Java中创建了自己的,并添加了ASN.1值解码器来说明我的答案:https://github.com/yafred/asn1-tool(分支文本ASN值支持)

相关问题 更多 >