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

LABVIEW字符串轉(zhuǎn)換為UTF-8編碼字符串
請(qǐng)教大神們,如何用labview創(chuàng)建一個(gè)UTF-8編碼的文本文件啊?
怎么在MDB中將編碼設(shè)置為UTF-8
如何將文件編碼更改為UTF-8?
如何將UTF-8轉(zhuǎn)換為GBK編碼
RT-Thread Studio的GBK編碼版本如何改為UTF-8呢
請(qǐng)問(wèn)如何在TouchGFX的TextArea通配符中顯示UTF-8文本?
UNICODE,GBK,UTF-8區(qū)別
ascii和utf8的區(qū)別_ASCII編碼與UTF-8的關(guān)系

MySQL中utf8和utf8mb4有什么區(qū)別
單片機(jī)中UTF-8如何轉(zhuǎn)換得到GBK編碼

評(píng)論