0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

UTF8String是如何編碼的?

西西 ? 來源:哲想軟件 ? 作者:cogitosoftware ? 2022-08-26 09:55 ? 次閱讀

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時添加有問題的填充。

編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 解碼器
    +關(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)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    單片機也可以輕松玩轉(zhuǎn)UTF-8碼和TTF字體了

    要讓智能設(shè)備支持各國不同的文字,首先得有支持全球文字的編碼集,時下最出名的要數(shù)UTF-8碼了。
    的頭像 發(fā)表于 11-23 17:18 ?4018次閱讀
    單片機也可以輕松玩轉(zhuǎn)<b class='flag-5'>UTF-8</b>碼和TTF字體了

    LABVIEW字符串轉(zhuǎn)換為UTF-8編碼字符串

    ,在這個庫中就包含了上述函數(shù)。庫的具體位置如下圖所示:這個庫中的許多VI都使用了一個內(nèi)置函數(shù)“"文本至UTF-8轉(zhuǎn)換”。該函數(shù)可以把LABVIEW字符串轉(zhuǎn)換為UTF-8編碼的字符串。簡單轉(zhuǎn)換程序如下圖所示:
    發(fā)表于 06-06 15:16

    請教大神們,如何用labview創(chuàng)建一個UTF-8編碼的文本文件啊?

    請教大神們,如何用labview創(chuàng)建一個UTF-8編碼的文本文件?。?/div>
    發(fā)表于 03-11 09:03

    怎么在MDB中將編碼設(shè)置為UTF-8

    是否有一種方法將編碼設(shè)置為MDB中的UTF-8。我在Ubuntu/PIC18/XC8編譯器上運行我的測試代碼,預(yù)處理失敗了,在UTF-8中使用了一個無效的字節(jié)序列。一些外來字符的存在導(dǎo)
    發(fā)表于 10-25 16:51

    如何將文件編碼更改為UTF-8?

    HII正在對我的項目本地化,需要使用UTF-8編碼的字符串。我有一切工作代碼,但在編輯器中,字符串顯示,如果編碼的ANSI拉丁代碼頁。我了解到,在開始新項目時可以選擇UTF-8
    發(fā)表于 07-03 10:30

    linux系統(tǒng)編碼怎么修改成utf-8

    LANG="zh_CN.GBK" 修改為LANG="zh_CN.UTF-8".保存退出
    發(fā)表于 07-11 07:28

    VC++ 怎么改變文件的編碼UTF-8?

    da哥們,問一下:VC++ 怎么改變文件的編碼UTF-8?謝謝。
    發(fā)表于 07-27 07:46

    如何將UTF-8轉(zhuǎn)換為GBK編碼

    概述我們在單片機開發(fā)中常會遇到需要將UTF-8轉(zhuǎn)換為GBK編碼的需求。在我們了解各種編碼格式的情況下可知,UFT-8不能直接轉(zhuǎn)成GBK,需中轉(zhuǎn)成unicode再轉(zhuǎn)換為gbk。而unic
    發(fā)表于 12-09 07:39

    RT-Thread Studio的GBK編碼版本如何改為UTF-8

    2.2.1工作區(qū)顯示 GBK 編碼,如何改為 UTF-8 呢?操作【窗口】–> 【首選項】在【搜索框】中,可以輸入【編碼】,這樣,找到 【常規(guī)】–> 【工作空間】【文本文件編碼】,改
    發(fā)表于 05-20 10:05

    請問如何在TouchGFX的TextArea通配符中顯示UTF-8文本?

    是“UTF-8”,所以這是文件編碼。我嘗試使用 UART 作為調(diào)試控制臺,它可以毫無問題地輸出 UTF-8 文本。我猜 TouchGFX 的 Unicode 函數(shù)不希望 char* 字符串是
    發(fā)表于 12-09 06:11

    UNICODE,GBK,UTF-8區(qū)別

    Unicode編碼,簡要解釋UCS、UTF、BMP、BOM等名詞。這是一篇程序員寫給程序員的趣味讀物
    發(fā)表于 03-28 10:28 ?2411次閱讀

    ascii和utf8的區(qū)別_ASCII編碼UTF-8的關(guān)系

    UTF-8是一種針對Unicode的可變長度字符編碼,又稱萬國碼。由Ken Thompson于1992年創(chuàng)建。現(xiàn)在已經(jīng)標(biāo)準(zhǔn)化為RFC 3629。UTF-8用1到6個字節(jié)編碼Unicod
    的頭像 發(fā)表于 01-30 13:34 ?3w次閱讀
    ascii和<b class='flag-5'>utf8</b>的區(qū)別_ASCII<b class='flag-5'>編碼</b>與<b class='flag-5'>UTF-8</b>的關(guān)系

    MySQL中utf8utf8mb4有什么區(qū)別

    MySQL在5.5.3之后增加了這個utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來兼容四字節(jié)的unicode。
    的頭像 發(fā)表于 04-12 19:21 ?1.3w次閱讀

    單片機中UTF-8如何轉(zhuǎn)換得到GBK編碼

    概述 我們在單片機開發(fā)中常會遇到需要將UTF-8轉(zhuǎn)換為GBK編碼的需求。在我們了解各種編碼格式的情況下可知,UFT-8不能直接轉(zhuǎn)成GBK,需中轉(zhuǎn)成unicode再轉(zhuǎn)換為gbk。而un
    發(fā)表于 11-26 10:51 ?19次下載
    單片機中<b class='flag-5'>UTF-8</b>如何轉(zhuǎn)換得到GBK<b class='flag-5'>編碼</b>

    Python字符編碼轉(zhuǎn)換

    -*- coding:utf- 8 -*-utf_8_a = '我愛中國' gbk_a = utf_8_a. decode ( 'utf-8
    的頭像 發(fā)表于 07-05 16:25 ?1037次閱讀
    Python字符<b class='flag-5'>編碼</b>轉(zhuǎn)換