簡體   English   中英

ASN.1 BER編碼整數0x‭10000000FFFFFFFCFC無限長度編碼

[英]ASN.1 BER Encode Integer 0x‭10000000FFFFFFFC Indefinite Length Encoded

我正在按照規范實現BER,我在問自己一個問題:使用不確定長度編碼時,如何將整數0x‭10000000FFFFFFFCFC編碼為BER整數(標簽0x02)?

到目前為止,我在規范中沒有找到任何轉義字符,因此我假設我無法對這樣的數字進行編碼,因此也必須依靠發件人來知道這一點,並使用短格式長度編碼來發送整數。 但是在BitStrings中,會出現相同的問題。

您永遠不要使用帶有整數的不確定長度編碼...

它是在X.690(08/2015)章節8.3(整數值的編碼)中編寫的:

The encoding of an integer value shall be primitive

不確定長度用於構造類型(SEQUENCE,SEQUENCE OF ...)和可以包含較大值的基本類型(字符串類型,BITSTRING,OCTET STRING ...)。 在這種情況下,規范會說:

The encoding of a bitstring value shall be either primitive or constructed at the option of the sender

CER編碼規則(第9章)使您大致了解撰寫本文時的含義:

 Bitstring, octetstring, and restricted character string values shall be encoded with a primitive encoding if they would require no more than 1000 contents octets, and as a constructed encoding otherwise

因此,您會看到即使是一個巨大的整數,在編碼時也總是會小於1000字節:因此,請選擇從不對整數使用不定長度格式

AFAIK,僅針對八位字節/位字符串定義了不定長編碼,而沒有針對數字類型定義不定長編碼。

另外,我認為BER中沒有任何轉義機制。

不定長編碼始終包含使用定長編碼編碼的數據塊(八位位組/位字符串)。 用BER的話來說,不確定的長度總是構造的形式。

使用定長編碼時,您始終有字節數可以按特定位置切割八位字節流,而無需任何標記。

使用不定長度編碼時,您需要使用那些兩個零的標記(實際上是一個具有零長度值的TVL三元組)來指示數據結束。 但是,您永遠不會將未編碼的原始數據(否則會干擾標記)作為有效負載。

您擔心以下情況:(a)使用圖2所示的替代構造的編碼,並且(b)內容八位字節包含八位字節0x0000,這將(錯誤地)解釋為內容結束標記。

當我第一次閱讀該問題時,我的第一個直覺是,肯定是BER就此發表了一些看法。 也許有一個轉義機制來避免內容中的0x0000。 也許編碼規則自然不會出現0x0000。

但是在仔細掃描了X.690規范幾次之后,我什么也沒找到。

因此,我認為您是對的:我認為發送方在這種情況下不應該使用替代構造編碼(實際上,這意味着永遠不要對存在此潛在問題的數據類型使用替代構造編碼,例如整數和位串)。

作為比較,在編碼結構時,Thrift在特定情況下僅允許使用STOP標記(字節00)作為“沒有更多字段”標記(請參閱https://github.com/erikvanoosten/thrift-missing-specification/blob /master/rpc-spec-binary-protocol.asciidoc

暫無
暫無

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

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