[英]python - asn1 parsed text to json
使用此鏈接中給出的文本,需要提取數據如下
YYYY Mmm dd hh:mm:ss.ms
,例如 2019 Aug 31 09:17:36.550Interpreted PDU:
下方的行中Interpreted PDU:
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 值表示法使消息易於閱讀。 因此,嘗試從文本形式解碼這些消息是不尋常的,您可能找不到用於此的工具。
理論上,通用方法是這樣的:
如您所見,這是一個很長的鏡頭(如果這個解釋太短或不清楚,我可以擴展)
除非您的任務是重復的和/或消息數量很大,否則請嘗試使用您已經知道的方法(手動搜索、正則表達式)來搜索日志文件。
如果你想看看創建 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.