2021SC@SDUSC Zxing开源代码(十七)Zxing代码解析——一维码
2021SC@SDUSC
目錄
- Code 39
- Code 93
- Code 128
- Codabar
- ITF
- 參考資料
前言:本篇博客主要介紹一維碼。
Code 39
Code39是條形碼的一種,也被稱為3 of 9 code、USD-3或者LOGMARS,由于編制簡單、能夠對任意長度的數據進行編碼、支持設備廣泛等特性而被廣泛采用。
特點:
1、能夠對任意長度的數據進行編碼。其局限在于印刷品的長度和條碼閱讀器的識別范圍。
2、支持設備廣泛。目前幾乎所有的條形碼閱讀設備都能閱讀Code39碼,打印機也是同樣情況。
3、編制簡單。簡單的開發技術就能快速生成相應的編碼圖像。
4、一般Code39碼由5條線和分開它們的4條縫隙共9個元素構成。線和縫隙有寬窄之分,而且無論線還是縫隙僅有3個比其他的元素要寬一定比例。39碼因此得名。
編碼規則:
1、每五條線表示一個字符;
2、 粗線表示1,細線表示0;
3、 線條間的間隙寬的表示1,窄的表示0;
4、 五條線加上它們之間的四條間隙就是九位二進制編碼,而且這九位中必定有三位是1,所以稱為39碼;
5、 條形碼的首尾各一個 * 標識開始和結束。
使用介紹:
Code 39只接受如下43個有效輸入字符:
26個大寫字母(A - Z),十個數字(0 - 9),連接號(-),句號(.),空格,美圓符號($),斜扛(/),加號(+)以及百分號(%)。
其余的輸入將被忽略。
code39通常情況下不需要校驗碼。但是對於精確度要求高的應用,需要在code39條形碼後面增加一個校驗碼。
由于可以合并兩個字符來表達第三個字符.這樣就可以用Code39條形碼來表示整個ASCII表.這樣就產生了Code 39全ASCII碼字型.
Code 93
Code 93 條碼比 Code 39 條碼更新、更安全且更緊湊,能讀取字母和數字。它用于軍事和汽車領域,還被加拿大郵政用來對特殊投遞信息進行編碼。
規格:Code 93 跟 Code 39 類似,其起始符和終止符不能以常規 ASCII 字符表示,通常指定為“*”。起始符后面是編碼的數據。跟 Code 39 一樣,每個字母由數值代表。數據后面是兩個字符的校驗碼,用于在手動輸入代碼時保證準確性。這兩個字符被稱為“Modulo-47 校驗符 C”和“Modulo-47 校驗符 K”。代碼中特定的數字組合生成一個余數,對應的字母或數字就變成了校驗符 C 或 K。校驗碼后面是終止符,緊接著是終止條紋,表明條碼結束。
優勢: Code 93 條碼比 Code 39 更小巧、更高效,且擁有更大的數據冗余,具備更高的安全性。它還包括 Code 39 中沒有的 5 個特殊字符。
缺點:不同于 Code 39,Code 93 不是自檢碼,因此需要一個校驗位。
public boolean[] encode(String contents) {contents = convertToExtended(contents);int length = contents.length();if (length > 80) {throw new IllegalArgumentException("Requested contents should be less than 80 digits long after converting to extended encoding, but got " + length);}int codeWidth = (contents.length() + 2 + 2) * 9 + 1;boolean[] result = new boolean[codeWidth];int pos = appendPattern(result, 0, Code93Reader.ASTERISK_ENCODING);for (int i = 0; i < length; i++) {int indexInString = Code93Reader.ALPHABET_STRING.indexOf(contents.charAt(i));pos += appendPattern(result, pos, Code93Reader.CHARACTER_ENCODINGS[indexInString]);}//添加兩個校驗和int check1 = computeChecksumIndex(contents, 20);pos += appendPattern(result, pos, Code93Reader.CHARACTER_ENCODINGS[check1]);//追加內容以反映添加的第一個校驗和contents += Code93Reader.ALPHABET_STRING.charAt(check1);int check2 = computeChecksumIndex(contents, 15);pos += appendPattern(result, pos, Code93Reader.CHARACTER_ENCODINGS[check2]);pos += appendPattern(result, pos, Code93Reader.ASTERISK_ENCODING);result[pos] = true;return result;}Code 128
CODE128碼是廣泛應用在企業內部管理、生產流程、物流控制系統方面的條碼碼制,由于其優良的特性在管理信息系統的設計中被廣泛使用,CODE128碼是應用最廣泛的條碼碼制之一。
CODE128碼是1981年引入的一種高密度條碼,CODE128 碼可表示從 ASCII 0 到ASCII 127 共128個字符,故稱128碼。其中包含了數字、字母和符號字符。
特點:
●可表示高密度數據和字符串;
●每個字符由3個條、3個空、11個單元構成,字符串可變長;
●符號內含校驗碼;
●有三種不同的版本:A(數字、大寫字母、控制字符)B(數字、大小字母、字符)C(雙位數字)
CODE128A:標準數字和大寫字母,控制符,特殊字符
CODE128B:標準數字和大寫字母,小寫字母,特殊字符
CODE128C:[00]-[99]的數字對集合,共100個
●可用128個字符分別在A、B或C三個字符串集合中。
構成:
一個Code 128條形碼由六部分組成。
1、空白區域
2、起始標記
3、數據區
4、校驗符
5、終止符
6、空白區域
Code 128條碼指定相互間隔的3個條形和3個空白(共六個單元)代表一個字符,每個字符由一個條開始,以一個空結束。 在條形碼字體中,最后一個條形通常與終止符一起組合成一個更寬的終止符。
Code 128碼與Code 39碼有很多的相近性,都廣泛運用在企業內部管理、生產流程、物流控制系統方面。不同的在于Code 128比Code 39能表現更多的字符,單位長度里的編碼密度更高。當單位長度里不能容下Code 39編碼或編碼字符超出了Code 39的限制時,就可選擇Code 128來編碼。所以Code 128比Code 39更具靈活性。
由于CODE128碼可表示較全面的字符(數字、字母和符號),在同樣長度的條碼中可容納的字符長度較長(高密度),條碼長度與字符串長度無明顯的敏感性,所以CODE128碼是企業內部管理系統最為廣泛使用的條碼碼制。
protected boolean[] encode(String contents, Map<EncodeHintType,?> hints) {int length = contents.length();// 檢查長度if (length < 1 || length > 80) {throw new IllegalArgumentException("Contents length should be between 1 and 80 characters, but got " + length);}// 檢查強制代碼集提示。int forcedCodeSet = -1;if (hints != null && hints.containsKey(EncodeHintType.FORCE_CODE_SET)) {String codeSetHint = hints.get(EncodeHintType.FORCE_CODE_SET).toString();switch (codeSetHint) {case "A":forcedCodeSet = CODE_CODE_A;break;case "B":forcedCodeSet = CODE_CODE_B;break;case "C":forcedCodeSet = CODE_CODE_C;break;default:throw new IllegalArgumentException("Unsupported code set hint: " + codeSetHint);}}Codabar
庫德巴條形碼( Codabar):也稱“血庫用碼”,可表示數字0-9,字符$、+、-,還有只能用作起始和終止符的a、b、c、d四個字符,空白區比窄條寬10倍,非連續性條形碼,每個字符表示為4條3空,條形碼長度可變,沒有校驗位,主要應用于血站的獻血員管理和血庫管理,也可作物料管理、圖書館、機場包裹發送中。
public boolean[] encode(String contents) {if (contents.length() < 2) {// 無法有開始/結束保護,因此暫時添加默認保護contents = DEFAULT_GUARD + contents + DEFAULT_GUARD;} else {// 驗證輸入并計算解碼長度。char firstChar = Character.toUpperCase(contents.charAt(0));char lastChar = Character.toUpperCase(contents.charAt(contents.length() - 1));boolean startsNormal = CodaBarReader.arrayContains(START_END_CHARS, firstChar);boolean endsNormal = CodaBarReader.arrayContains(START_END_CHARS, lastChar);boolean startsAlt = CodaBarReader.arrayContains(ALT_START_END_CHARS, firstChar);boolean endsAlt = CodaBarReader.arrayContains(ALT_START_END_CHARS, lastChar);if (startsNormal) {if (!endsNormal) {throw new IllegalArgumentException("Invalid start/end guards: " + contents);}// 已具有有效的開始/結束} else if (startsAlt) {if (!endsAlt) {throw new IllegalArgumentException("Invalid start/end guards: " + contents);}// 已具有有效的開始/結束} else {// 不是從guard開始的if (endsNormal || endsAlt) {throw new IllegalArgumentException("Invalid start/end guards: " + contents);}// 否則也不會以guard結尾,所以添加一個默認值contents = DEFAULT_GUARD + contents + DEFAULT_GUARD;}}// 起始字符和結束字符分別解碼為10個長度。int resultLength = 20;for (int i = 1; i < contents.length() - 1; i++) {if (Character.isDigit(contents.charAt(i)) || contents.charAt(i) == '-' || contents.charAt(i) == '$') {resultLength += 9;} else if (CodaBarReader.arrayContains(CHARS_WHICH_ARE_TEN_LENGTH_EACH_AFTER_DECODED, contents.charAt(i))) {resultLength += 10;} else {throw new IllegalArgumentException("Cannot encode : '" + contents.charAt(i) + '\'');}}// 在每個字符之間放置一個空格。resultLength += contents.length() - 1;}ITF
ITF條碼,又稱交叉二五條碼,主要用于運輸包裝,是印刷條件較差,不允許印刷EAN-13和UPC-A條碼時應選用的一種條碼。
ITF條碼是有別于EAN、UPC條碼的另一種形式的條碼。在商品運輸包裝上使用的主要是14位數字字符代表組成的ITF-14條碼。
ITF條碼是一種連續型、定長、具有自校驗功能,并且條、空都表示信息的雙向條碼。ITF-14條碼的條碼字符集、條碼字符的組成與交插二五碼相同。它由矩形保護框、左側空白區、條碼字符、右側空白區組成.
public boolean[] encode(String contents) {int length = contents.length();if (length % 2 != 0) {throw new IllegalArgumentException("The length of the input should be even");}if (length > 80) {throw new IllegalArgumentException("Requested contents should be less than 80 digits long, but got " + length);}checkNumeric(contents);boolean[] result = new boolean[9 + 9 * length];int pos = appendPattern(result, 0, START_PATTERN, true);for (int i = 0; i < length; i += 2) {int one = Character.digit(contents.charAt(i), 10);int two = Character.digit(contents.charAt(i + 1), 10);int[] encoding = new int[10];for (int j = 0; j < 5; j++) {encoding[2 * j] = PATTERNS[one][j];encoding[2 * j + 1] = PATTERNS[two][j];}pos += appendPattern(result, pos, encoding, true);}appendPattern(result, pos, END_PATTERN, true);return result;}參考資料
CODE39
CODE 93 條碼
code128
ITF條碼
總結
以上是生活随笔為你收集整理的2021SC@SDUSC Zxing开源代码(十七)Zxing代码解析——一维码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美字
- 下一篇: 很遗憾,这就是现实!35岁之后软件测试工