書接上回兔甘,7.4.4
舉個例子(1H級別的符號)
輸入數(shù)據(jù)??? AC-42
1?? 根據(jù)表5來確定字符的具體數(shù)值 AC-42? ->?? 10,12,41,4,2
2?? 對字符數(shù)值兩兩分組??? (10,12)(41,4)(2)
3?? 按照編碼規(guī)則,轉(zhuǎn)換為11位的比特?
10,12?? 10*45+12? ->? 00111001110
41.4??? 41*45+4?? ->?? 11100111001
2?? ->?? 000010
4?? 鏈接成數(shù)據(jù)子句
00111001110 11100111001 000010
5??? 字符數(shù)量轉(zhuǎn)換為二進(jìn)制
5 → 000000101
6??? 添加模式標(biāo)示0010 至模式頭部
0010 000000101 00111001110 11100111001 000010
字母數(shù)字類別的字符与学,比特長度轉(zhuǎn)換依賴與下面的公式
B = M +C + 11(D DIV2) + 6(D MOD2)
其中?? B 是? 比特流的長度??? M? 模式標(biāo)識符的數(shù)值 (QR 標(biāo)準(zhǔn)下是2個比特含友,MICRO 標(biāo)準(zhǔn)請看表2)???? C? 字符數(shù)量的標(biāo)示數(shù)值尘喝,具體看表3??? D?? 輸入字符的真實數(shù)據(jù)
7.4.5? 字節(jié)模式
在這種模式下询一,一個8比特長度的 字直接代表一個? 字節(jié)的數(shù)值悠夯, 包括8比特密度的字符
備注1????? 在JIS8字符編碼中,具體看表H1,? 80-9F以及 E0到FF的字段沒有分配庞呕。但是卻被接受了新翎, 他們其中的一些,是作為SHIFT JIS編碼中的第一個字節(jié)了(可以參考表H2)住练,并且可能會被用于區(qū)分是 JIS8還是SHIFT JIS編碼地啰,或者是因為啟用KANJI的壓縮模式生成的。JIS X 0208 給出了換擋后的編碼的具體含義
備注2???? JIS8 編碼中的00 - 7F的數(shù)據(jù)與? ISO 8859-1以及? ISO 646 IRV格式保持一直讲逛,除了? 5C到7E之間的數(shù)值
二進(jìn)制的數(shù)據(jù)稍后會被模式標(biāo)示和字符數(shù)量標(biāo)示所前綴亏吝,字節(jié)模式在標(biāo)示在QRCODE中是四個比特,在MICRO模式中的約定參看表2盏混。 字符數(shù)量的標(biāo)示蔚鸥,在表三中被定義。字符數(shù)量的長度會被編碼為二進(jìn)制后许赃,加到模式標(biāo)示和二進(jìn)制數(shù)據(jù)子句之間止喷。
對于所以字符類型的數(shù)據(jù)字節(jié)流長度,可以通過下面的額公式計算
B = M +? C + 8D
其中? B是比特流的長度混聊,M是模式標(biāo)示的數(shù)值弹谁,QRCODE標(biāo)準(zhǔn)中其為4個比特,MICRO的約定參看表2句喜,? C 是字符數(shù)量的比特標(biāo)示预愤,參見表3??? D是輸入的字符數(shù)據(jù)長度
7.4.6 日本字模式
在SHIFT JIS系統(tǒng)中,日本字由兩個字節(jié)的組合標(biāo)示咳胃,他們的數(shù)值從JIS X 0208中變換而來植康。JIS X 0208 給出了所有編碼包含的意義,被以日本字模式輸入的字符數(shù)據(jù)會按照下面的規(guī)則展懈,會編碼為一個13字節(jié)長度的二進(jìn)制字销睁。?? 之后數(shù)據(jù)流會被加上模式標(biāo)示和數(shù)據(jù)長度的前綴。? 該模式的指示符號存崖,在QRCODE標(biāo)準(zhǔn)中是一個數(shù)字像是的4比特單位榄攀,在MICRO中的形式看表2,字符長度的標(biāo)示看表3.? 數(shù)據(jù)長度的數(shù)量會被編碼為2進(jìn)制金句,然后添加到數(shù)據(jù)流和模式標(biāo)示中間檩赢。
1?? 對于SHIFT JIS中 8140-9FFC的字符來說
??? a)?? 需要減去 8140
??? b)?? 使用C0乘以結(jié)果的最大有效字節(jié)
??? c)?? 最小有效字節(jié)加以? B步驟的結(jié)果
??? d)?? 將其轉(zhuǎn)換為一個13字節(jié)長度的比特序列
2??? 對于E040到 EBBF中的數(shù)值來說
??? a)??? 減去 C140
??? b)??? C0乘以最大有效字節(jié)
??? c)??? B步驟的結(jié)果加以最小有效字節(jié)
??? d) ? 轉(zhuǎn)換為13比特序列
舉個例子
輸入字符串??? 點? 和 茗
SHIFT JIS的對應(yīng)數(shù)值??? 935F??????? E4AA
1?? 減去8140 或者 C140??? 121F???? 236A
2?? 使用CO乘以最大有效字節(jié)????? D80?? 1A40
3?? 加上最小有效字節(jié)???? D9F???? 1AAA
4?? 進(jìn)行轉(zhuǎn)換為13比特的長度????? 0D9F ->? 0 1101 1001 1111?? 1AAA-> 1 1010 1010 1010
3?? 對于所有的字符來說
??? e)??? 在數(shù)據(jù)比特前面加上模式標(biāo)示(看表2)以及字符轉(zhuǎn)換后的二進(jìn)制長度(表中定義的比特數(shù)量)
日本字模式的數(shù)據(jù)比特長度計算公式如下
B = M +C + 13D
其中?? B是比特流的長度??? M 是模式指示符(QRCODE是四個比特,MICRO表中看表2)
C? 字符長度標(biāo)示(看表三)???? D 輸入的數(shù)據(jù)字符數(shù)據(jù)
混合模式的意思提供一個選項违寞,是一個符號里面包含多個數(shù)據(jù)序列贞瞒,如果需要的話,可以一個接一個的切換模式并且解析趁曼【或者是處于增加編碼密度的考慮。?? 指引文檔可以參見Annex J文檔挡闰,所有的片段都需要選擇74.2-7.4.6之間合適的編碼模式乒融。他們的每個片段掰盘,都是字符數(shù)量標(biāo)示緊跟在模式標(biāo)示后面的基本結(jié)構(gòu)。說明13? 解釋了這種包含數(shù)據(jù)的片段赞季。
7.4.8? FNC1 模式
7.4.8.1? 概述
在QRCode符號種愧捕,有一種符號,他們的有兩個模式符號連續(xù)使用的申钩。 他們的符號模式次绘,是來自與7.3.2 - 7.3.9以及7.4.2-7.4.7之間的定義的模式。 他們的信息編碼方式與工業(yè)和應(yīng)用所指定撒遣。 這兩個模式符號中間的數(shù)據(jù)是由不相干的參數(shù)數(shù)據(jù)有效率的編碼構(gòu)成邮偎,當(dāng)這種模式被使用的時候編碼器需要先按照14.2或者ANNEX E文檔中的約定傳輸符號的標(biāo)識符。
7.4.8.2? ?一號位置
注意义黎,這里的“一號位置”并不是位于一個連同的句子中的禾进,他是一個在func1的128字符一個歷史引用。
這個模式的指示標(biāo)識符號會根據(jù)gs1應(yīng)用標(biāo)準(zhǔn)廉涕,進(jìn)行格式化的編碼數(shù)據(jù)命迈。在這種期望下,一個符號中應(yīng)該只出現(xiàn)一次這種符號火的,并且他們應(yīng)該在當(dāng)?shù)谝粋€模式只是符號前出現(xiàn)(例如數(shù)字壶愤,字節(jié)等模式)。并且應(yīng)該在ECI和結(jié)構(gòu)勾畫添加頭之后馏鹤。當(dāng)GS1標(biāo)準(zhǔn)符號出現(xiàn)了fnc1的符號征椒,作為數(shù)據(jù)字段的表示符號,QRCODE 應(yīng)該用字符模式下的%或者GS(字節(jié)數(shù)值是1D)來表達(dá)這個符號湃累。如果在數(shù)據(jù)中也出現(xiàn)了%勃救,那么它會被編碼為%%,? 編碼器在遇到%的時候,應(yīng)該將其傳輸為ASCII/JIS8的數(shù)值1D,如果遇到%% 應(yīng)該將其傳輸為一個單獨的%
舉個例子:
輸入數(shù)據(jù):? 0104912345123459( 應(yīng)用標(biāo)識01 代表了GS1 文章符號治力,長度固定蒙秒,數(shù)據(jù)段是04912345123459)
15970331 (15的意思是 最佳截至日期,固定長度,后面的數(shù)據(jù)代表97年三月31日)
30128(30代表了質(zhì)量宵统,可變長度晕讲,數(shù)值128)(需要分隔符號)
10ABC123(10 代表了一批數(shù)字,可變長度,數(shù)值A(chǔ)BC123)
整體數(shù)據(jù)會被編碼:01049123451234591597033130128%10ABC123
符號標(biāo)記的bit:? ??
0101(FNC1的模式標(biāo)識符马澈,標(biāo)記了第一個位置)
0001(模式標(biāo)識符瓢省,意思是數(shù)字)
0000011101(字符長度標(biāo)識符,29痊班,意思是上面比特總長度)
0010(數(shù)字英文模式勤婚,標(biāo)識符)
000001001(字符長度標(biāo)識9, 上面的那段%ABC123)
傳輸后的數(shù)據(jù)(詳見14.2 AnnexF)
例子2? ?編碼和傳輸過程中%的體現(xiàn)
? ? ? ? 輸入數(shù)據(jù) 123%? ? 編碼后? 123%%? ? 傳輸數(shù)據(jù) 123%
7.4.8.3? ?FNC1的第二個位置
注意 “第二個位置”的意思并不是在一個連同的句子中的涤伐,他們是一個歷史的相對引用位置馒胆。 在FNC1模式下128個符號中的一個缨称。
這個模式的標(biāo)識指示符,是根據(jù)由基于AIM國際標(biāo)準(zhǔn)的特定工業(yè)和應(yīng)用標(biāo)準(zhǔn)的編碼格式祝迂。他會立即跟在一個1字節(jié)字后面睦尽,這個字節(jié)是由符合AIM標(biāo)準(zhǔn)的應(yīng)用程序制定的。? 在此場景下液兽,標(biāo)識符號應(yīng)該只出現(xiàn)一次,并且應(yīng)該在被模式符號之前(數(shù)字掌动,英文四啰,字節(jié),雙字節(jié)字)粗恢,并且跟在ECI 或者結(jié)構(gòu)化添加頭之后柑晒。? ? 標(biāo)識符可能是由[A-Z,a-z]中的任意單個拉丁字符組成(他們會被ASCII的數(shù)值 正100所標(biāo)識)眷射〕自蓿或者兩位數(shù)字,
兩位數(shù)字直接就代表了妖碉,他們自己的數(shù)值涌庭,此時編碼器應(yīng)該將這些字符編碼放在數(shù)據(jù)之前。當(dāng)應(yīng)用程序需要FNC1字符(這是一個約定好的特殊字符)作為一個數(shù)字段符號時應(yīng)該加上字符格式的%作為前綴欧宜,編碼格式為ASCII或者jis8的GS 在字節(jié)模式下坐榆,? 如果原本有%,則展示為%%.
7.4.9 結(jié)束符號
符號的數(shù)據(jù)部分結(jié)束時冗茸,應(yīng)該加上0bit序列作為標(biāo)識席镀。這些事情在表2中有定義。 這些比特序列會跟在最終模式片段之后夏漱。? 終止符號在處理數(shù)據(jù)時應(yīng)該被忽略,如果數(shù)據(jù)剛剛好填充滿符號豪诲。或者如果剩余空間不足比特長度終止符長度的時候挂绰,應(yīng)該縮寫屎篱。
7.4.10 比特流編碼為字
當(dāng)比特流轉(zhuǎn)換為各個模式的片段時,必須按照一定的順序進(jìn)行葵蒂。終止符號需要被添加到比特流后面芳室,就如7.4.9所描述的那樣。 然后得到的結(jié)果需要被拆分編碼為字刹勃。所有的字都應(yīng)該時8個比特長度堪侯,除了micro QR中的M1-M3.他們是四個比特長度。? 如果比特不能被8整除荔仁,那說明他們還不到一個字的邊界伍宦,應(yīng)該填充0比特知道邊界芽死。? 比特的長度應(yīng)該符合表8中對version和糾錯碼的約定,不足的地方交替填充字? 11101100和00010001。? ?對于MICRO QR M1-M3來說次洼,最終的字是四個比特長度关贵。他們填充的比特字是0000. 最終得到的比特流會按照7.5的約定添加糾錯碼信息,按照某一確定的版本卖毁。? 再之后揖曾,可能會添加 3,4,7? 剩余比特(全是0)加到糾錯信息的后面。最后得到可以完全填充容量的比特信息亥啦。
備注1? ?所有的字都是8比特炭剪,除了M1-M3版本的最后一個數(shù)據(jù)字是4比特。
備注2? ? 這里的data bit 數(shù)量 包含了模式指示符號和字符長度標(biāo)識
7.5? 糾錯信息
7.5.1? 糾錯信息容量
QR CODE使用了里德所羅門算法來識別和糾正錯誤信息翔脱。會有一系列糾錯碼數(shù)據(jù)字被生成出來奴拦,添加到數(shù)據(jù)的后面用來讓符號在數(shù)據(jù)丟失或損壞得情況下,依然可以使用届吁。? 表8中定義了四種可以選擇得糾錯碼級別错妖,他們可以讓恢復(fù)指定數(shù)量得容量。
AnnerK.2給出了如何選擇一個適用得糾錯碼級別疚沐,應(yīng)用于圖像暂氯。
Micro QR不支持H級別
糾錯字可以糾正兩種類型得情況,第一種時失去得字?jǐn)?shù)據(jù)(明確位置信息亮蛔,但是信息字節(jié)錯誤)第二種時錯誤信息(未知位置信息株旷,錯誤得信息字)? ?遺失得意思時,無法掃描或者無法解碼尔邓,錯誤得意思時解析失敗的符號字符晾剖。因為二維碼時一種矩陣技術(shù),所以如果某個模塊 黑色被當(dāng)成了白色梯嗽,或者白色被當(dāng)成了黑色齿尽,都可以被識別為一個錯誤標(biāo)識得內(nèi)容。這樣得一個錯誤灯节,需要兩個糾錯碼才能糾正它循头。
可以被就錯了得遺失或者錯誤 的模點遵循下面的公式:
e + 2t <= d- p
e? ?是遺失的模點數(shù)量? ? ?t 是錯誤的模點數(shù)量? ?d? 是糾錯碼數(shù)量? ? p 是被錯誤解析的保護(hù)字節(jié)(譯者注:錯誤而非遺失)
一般情況下,p 是0炎疆,但是如果大部分的糾錯碼容量就去用于處理遺忘模點卡骂,然后可能會導(dǎo)致沒有發(fā)現(xiàn)的錯誤增加。不論何時形入,當(dāng)遺失模點的數(shù)量超過糾錯碼一般的時候全跨,p =3。? 對于小于8個糾錯碼字的小符號來說亿遂,遺忘糾錯不應(yīng)被使用(e = 0 并且 p > 0)
舉個例子 在版本6H符號來說浓若,數(shù)據(jù)容量尺寸是172渺杉,112是糾錯碼字,剩下60個純粹的數(shù)據(jù)字挪钓。112個數(shù)據(jù)糾錯碼是越,可以糾正56個錯誤字.(解析錯誤,或者移位錯誤)? 換句話說 56/172? 也就是32.6%的符號容量
套用上面講過的公式碌上,那么下列數(shù)值將會用于定義p
p =3? ?在1-L 或者M(jìn)2-L 上
p= 2? 在1-M,2-L,M1,M2-M,M3-L,M4-L
p = 1? 1-Q,1-H,3-L
p =0 其他情況
當(dāng) p > 0的時候倚评,換句話說(1,2馏予,3)天梧。 此時p字節(jié)扮演了錯誤碼搜集的功能,并且用于組織當(dāng)錯誤的數(shù)量超過限制之后吗蚌,繼續(xù)傳輸數(shù)據(jù)的作用腿倚。e 必須小于 1/2的d纯出,舉個例子再2L 版本中蚯妇,一共有44個字長,其中34個是是數(shù)據(jù)字暂筝,還有十個是糾錯碼箩言。從表9中可以看到它的錯誤容量是4(e = 0),套用上面的公式:
0 + 2 * 4 = 10 - 2;
它的意思是糾正四個錯誤焕襟,只需要8個錯誤矯正符號陨收。剩下的兩個可以用來檢測(僅僅是檢測,而不是修正)額外的錯誤鸵赖。如果超過四個錯誤务漩,那么解析失敗。
根據(jù)不同的版本和糾錯碼級別它褪,數(shù)據(jù)比特需要被拆分不同的模塊中饵骨,用以分割各自的糾錯算法。在表9中有定義所有的版本茫打,糾錯碼的整體字?jǐn)?shù)居触,糾錯碼字?jǐn)?shù),以及糾錯碼塊的數(shù)量和結(jié)構(gòu)老赤。
如果需要填充剩余位置轮洋,請使用Bit0填充。
table9太長了抬旺。換篇文章再聊弊予。