簡體   English   中英

用Python解碼ASN1 UPER

[英]Decoding ASN1 UPER in Python

我需要使用python解碼ASN1消息。 我查看了pyasn1庫,但它不支持UPER。 我可以用來在python中解碼ASN1 UPER

有模式嗎?

假設您擁有要解碼的數據的ASN.1模式,那么可以先看一下歐洲航天局TASTE框架 這是一個基於ASN.1的大型應用程序開發框架,用於航天器系統。

該框架與您和您的需求無關。 但是,它的核心潛伏在一個支持Python代碼生成和uPER的ASN.1模式編譯器中。 您最好從試用其預構建的VM映像開始,該映像為您提供了一個已安裝所有內容的Linux: 請參見此處 您將使用它來將架構編譯成python源代碼,然后可以對來自/到Python類的uPER數據進行編碼/解碼。 順便說一句,您也可以對C,C ++,C#,Java,ADA執行相同的操作。

我自己並沒有很生氣地嘗試過它,但是使用它建造了許多ESA太空飛船,所以這可能沒問題。

無法了解架構?

如果您沒有架構,那么您將會遇到一些問題。 沒有模式文件,無法解碼uPER。 這是因為uPER數據已被充分打包,幾乎沒有證據表明數據的結構。 您將被簡化為猜測該模式可能是什么,嘗試解碼,看看它是否適用於所有數據,否則請重試。

如果已知它是Cannonical PER編碼的,那么您可以在不使用模式的情況下對其進行解碼,但這仍然需要很多努力。

這與BER編碼數據形成鮮明對比,BER編碼數據通過合並每個編碼PDU字段的標簽,類型和值信息,確實保留了數據結構的詳細信息。 但是,BER編碼的數據要比PER大得多,因此它不會在無線電系統或其他帶寬受限的傳輸通道上使用。

==編輯==

剛剛看過TASTE之后,現在不確定它是否會生成Python代碼。 Python是該框架的依賴項,但它並未要求它生成Python代碼的任何地方。 看起來只是C / C ++或ADA。

無論如何,ASN.1編譯器似乎已經在GITHUB上結束了。 這將生成C代碼(還有ADA,哇!),您可以從Python調用它的一種或多種方式。 它不會那么整潔,但總比沒有好。

注意:此編譯器的編譯模式受到限制(它需要對數組等大小進行限制,以至最終只能生成靜態大小的對象)。

最好的選擇是調用由其他ASN.1編譯器生成的C,C ++或Java或C#代碼-在Objective SystemsOSS Nokalva都有商業代碼

==還有另一個編輯==

本頁討論Python,ASN.1 uPER。

==再加一次編輯==

PyASN1頁面引用asn1ate ,這是Python的代碼生成器。 據報道它是“ alpha質量”,但是對於一個簡單的模式來說可能就足夠了。 當然值得一看。

Python軟件包asn1tools實現了未對齊的打包編碼規則(UPER)。 它支持大多數ASN.1類型及其約束。

下面是一個示例,說明如何使用該包來編譯名為foo.asn的規范,然后使用它來編碼和解碼Question類型:

>>> import asn1tools
>>> foo = asn1tools.compile_file('tests/files/foo.asn', 'uper')
>>> encoded = foo.encode('Question', {'id': 1, 'question': 'Is 1+1=3?'})
>>> encoded
bytearray(b'\x01\x01\t\x93\xcd\x03\x15l^\xb3~')
>>> foo.decode('Question', encoded)
{'question': u'Is 1+1=3?', 'id': 1}
>>> 

暫無
暫無

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

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