1、在解碼PER 編碼的PDU 時,IA5String字符似乎被解碼,就好像從它們的數(shù)值中減去了1。為什么?
這是編碼器或解碼器端ASN.1 語法中的拼寫錯誤導(dǎo)致的常見錯誤。省略空格字符通常很容易。例如假設(shè)在編碼器端 IA定義為:
IA::= IA5String (FROM ("0123456789No.*,"))
但在解碼器方面:
IA::= IA5String (FROM ("0123456789No. *,")) <-- space ishere
帶有一個額外的空格字符“”。這導(dǎo)致值
aIA ::= "1234"
在PER 中被解碼為“2345”而不是“1234”。PER中允許的字母表在值的編碼/解碼方式中起著至關(guān)重要的作用。
2、你能解釋一下UTF8String 以及它是如何編碼的嗎?
UniversalString和UTF8String 都支持完全相同的字符集,前64K 字符都是BMPString 中的字符集。請注意,BMPString 的前128 個字符與IA5String是同一組抽象字符(我們使用術(shù)語“抽象”來指出它們實際上是相同的,但它們的編碼不同),并且由于BMPString 是UniversalString 和UTF8String 意味著IA5String 是這些字符串類型的前128 個抽象字符。
好的,既然我們知道UTF8String 不是由BMPString 和UniversalString 字符組成,而只是對與BMPString 和UniversalString編碼的字符集完全相同的一組字符進行編碼的不同方式,那么讓我們來談?wù)勊鼘嶋H上是如何編碼的。
簡而言之,如果一個字符的第一個字節(jié)的第一位是0,則意味著這個字符是一個字節(jié)長,如果你看一下字符映射你會看到這組字符(其中有128 個,自然)是美國 ASCII(即IA5String)。
如果字符的前3 位是110,則表示該字符長2 個字節(jié),其值為110xxxxxx 10xxxxxx,其中x 是有效位,110中的11 表示字符長2 個字節(jié)。
如果字符的前4 位是1110,則表示該字符長3 個字節(jié),其值為1110xxxx 10xxxxxx 10xxxxxx,其中x 是有效位,1110中的111 表示該字符長3 個字節(jié)。
如果一個字符的前5 位是11110,則表示該字符長4 個字節(jié),其值為11110xxx 10xxxxxx 10xxxxxx10xxxxxx,其中X 是有效位,11110中的1111 表示該字符長4 個字節(jié)。
如果字符的前6 位是111110,則表示該字符長5 個字節(jié),其值為111110xx 10xxxxxx 10xxxxxx10xxxxxx 10xxxxxx,其中X 是有效位,111110中的11111 表示該字符長5 個字節(jié)。
如果一個字符的前7 位是1111110,則表示該字符長6 個字節(jié),其值為1111110x 10xxxxxx 10xxxxxx10xxxxxx 10xxxxxx 10xxxxxx,其中X 是有效位,1111110中的111111 表示該字符長6 個字節(jié)。
3、擴展加法的PER ALIGNED編碼的起始位應(yīng)該是八位字節(jié)對齊還是八位字節(jié)不對齊?
它應(yīng)該作為八位字節(jié)未對齊的位字段添加。
X.691(2008)的第19.7 和19.8節(jié)說,擴展添加的編碼從位掩碼開始,該位掩碼的位指示特定擴展的存在。反過來,位掩碼以它的長度為前綴,根據(jù)19.8,它被編碼為“通常較小的長度”。
X.691(2008)的第11.9.3.4 節(jié)規(guī)定,“通常較小的長度”的編碼從一個0 或1 的單個位位字段開始(如果擴展的數(shù)量<=64 和1,則為0 除此以外)。
術(shù)語“位域”在X.691(2008) 的第3.7.3 節(jié)中進行了解釋,隨后是澄清說明:
注意:如果使用該術(shù)語后跟“對齊變體中的八位字節(jié)對齊”,這意味著在PER對齊變體的完整編碼中,位字段需要從八位字節(jié)邊界開始。
由于X.691(2008) 的第11.9.3.4節(jié)沒有明確提到單個位字段是八位字節(jié)對齊的,這意味著不需要八位字節(jié)邊界上的對齊。
請參閱X.691(2008) 的第11.1.4節(jié),了解如何在構(gòu)建完整編碼時使用位域,而不是如何使用八位字節(jié)對齊的位域。
4、有沒有辦法跳過解碼BER 中的SET/SEQUENCE中的一些不需要的字段?
是的,您可以這樣做,但只能在BER/DER/CER 中,而不是在PER/UPER 中,因為PER 的性質(zhì)??紤] BER/DER/CER 中的以下ASN.1 語法:
基于上述語法,您可以對S1PDU 進行編碼,但使用S2PDU 對其進行解碼,其類型利用ASN.1可擴展性。第一個“...”標(biāo)志著擴展的開始,第二個標(biāo)志著它的結(jié)束。第二個“...”之后的字段d繼續(xù)擴展根。在 BER/DER/CER中,解碼器將簡單地跳過兩個擴展標(biāo)記之間的所有字段并繼續(xù)使用字段d進行解碼。
5、為什么零填充出現(xiàn)在短約束受限字符串類型的PER ALIGNED 編碼中?
讓我們考慮一下:
N::= NumericString (SIZE(0..3))
nN ::= "27"
和:
N::= NumericString (SIZE(0..4))
nN ::= "27"
X.691(2008)的第30.5.7條說:
30.5.7如果“aub”不等于“alb”或大于或等于64K,則應(yīng)調(diào)用11.9以添加前面的位字段通過一個長度行列式,其中 n作為字符串中字符的計數(shù),長度行列式為“alb”,上限為“aub”。如果“aub”乘以“b”大于或等于16,則應(yīng)將位字段添加為字段(對齊變體中的八位字節(jié)對齊),否則應(yīng)添加為非八位字節(jié)的位字段對齊。這樣就完成了本條的程序。
由于我們有SIZE(0..4),我們計算:
aub* b == 4 * 4 = 16
這使我們在上限大于3時添加有問題的填充。
編輯:黃飛
-
解碼器
+關(guān)注
關(guān)注
9文章
1129瀏覽量
40636 -
編碼器
+關(guān)注
關(guān)注
45文章
3573瀏覽量
133980
原文標(biāo)題:OSS Nokalva:ASN.1問答時間(3)
文章出處:【微信號:哲想軟件,微信公眾號:哲想軟件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論