簡體   English   中英

python - asn1 將文本解析為 json

[英]python - asn1 parsed text to json

使用此鏈接中給出的文本,需要提取數據如下

  1. 每條記錄都以YYYY Mmm dd hh:mm:ss.ms ,例如 2019 Aug 31 09:17:36.550
  2. 每條記錄都有一個標題,從上面的第 1 行開始,以一個空行結束
  3. 記錄數據包含在Interpreted PDU:下方的行中Interpreted PDU:
  4. 感興趣的記錄是記錄頭第一行有0xB821 NR5G RRC OTA Packet -- RRC_RECONFIG

是否可以將上面#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]

請注意,輸入文本是 3GPP 38.331第 6.3.2 節中 ASN1 數據規范的解析輸出。 我不確定普通的 python 文本解析是處理這個問題的正確方法,還是應該使用像asn1tools庫這樣的東西? 如果是這樣,對這些數據的示例用法會有所幫助。

不幸的是,不太可能有人會直接回答您的問題(這與如何從 asn1 數據文件中提取數據並將其加載到數據幀中非常相似

鏈接的文本顯然是一個日志文件,其中使用 ASN.1 值表示法使消息易於閱讀。 因此,嘗試從文本形式解碼這些消息是不尋常的,您可能找不到用於此的工具。

理論上,通用方法是這樣的:

  1. 收集用於創建 ASN.1 消息的 ASN.1 定義(架構)
  2. 使用 ASN.1 工具(又名編譯器)編譯這些定義,以您喜歡的語言 (python) 生成對象模型。 該工具將提供用於編碼和解碼的特定代碼……您將使用 ASN.1 值解碼器。
  3. 添加您的自定義代碼(添加到對象模型或插入 ASN.1 編譯器)以對您的 JSON 對象進行編碼

如您所見,這是一個很長的鏡頭(如果這個解釋太短或不清楚,我可以擴展)

除非您的任務是重復的和/或消息數量很大,否則請嘗試使用您已經知道的方法(手動搜索、正則表達式)來搜索日志文件。

如果你想看看創建 ASN.1 工具需要什么,你可以找到一些(沒有那么多,因為 ASN.1 不是特別年輕和流行)。 查看https://github.com/etingof/pyasn1 (python)

我在 Java 中創建了自己的樂趣,我正在添加 ASN.1 值解碼器來說明我的答案: https : //github.com/yafred/asn1-tool (branch text-asn-value-support)

鑒於您有輸入數據的文本表示,您可以查看解析庫。 這允許您在字符串中查找模式並將內容分配給變量。

以下是提取時間、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)

由於您有一個相當復雜的結構和大量的數據字段,這可能會變得有點麻煩,但我個人更喜歡這種方法而不是正則表達式。 也許還有一種更智能的方法來解析日期(不幸的是,它似乎沒有庫支持的標准格式之一)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM