android编程实现128条形码的生成和识别
條形碼二維碼由于規則簡單,讀取效率,在目前人們生活中應用廣泛。一般情況下,不必了解原理,就可以借助ZXING和BARCODE,ZBAR等各種開發庫實現。在某些特殊場合或者特別要求的場合下,比如發明一種特殊的條形碼,比如改進編碼規則,比如對特別識別過程優化等情況。CODE128應用十分廣泛,這里從CODE128的編碼規則并從規則出發開發相應的二維碼生成和識別程序來拋磚引玉。
?
CODE128簡介
CODE128 碼于 1981 年推出,是一種長度可變、連續性的字母數字條碼。與其他一維條碼比 較起來,相對較為復雜,支持的宇元也相對較多,又有不同的編碼為式可供交互運用,因此其應 用彈性也較大。
CODE 128 特性
1、具有 A、 B、 C 三種不同的編碼類型,可提供標準 ASC II中 128 個宇元的編碼使用; 2、允許雙向掃描;
3、可自行決定是否加上校驗位;
4、條碼長度可調,但包括開始位和結束位在內,不可超過 232 個字元;
5、同一個 CODE128 碼可以由 A、 B、 C 三種不同編碼規則互換,既可擴大字元選擇的范圍, 也可縮短編碼的長度。
CODE 128 編碼方式的編碼范圍
1、 CODE128A:標準數字、大寫字母、控制符及特殊宇符;
2、 CODE128B:標準數字、大寫宇母、小寫字母及特殊字符;
3、 CODE128C/EAN128: [ 00]~[ 99]的數字對集合,共 100 個,既只能表示偶數位長 度的數字。
CODE 128 編碼規則
開始位+[ FNC1(為 EAN128 碼時附加)]+數據位+校驗位+結束位
?
CODE128 校驗位計算
(開始位對應 ID+每位數據在整個數據中的位置×每位數據對應的 ID 值) % 103
CODE 128 編碼表如下,
橫向依次對應索引ID, ABC三種編碼字符,BANDCODE和二進制編碼表,縱向對支持的字符,C碼只支持數字,B碼支持數字,字母和特殊字符,A碼支持數字,字母,特殊字符和控制字符
?
?? A ?B ?C???A B C
00 ?SP ?SP ??00 ?11011001100 ??
01 ?! ?! ??01 ?11001101100 ??
02 ?" ?" ??02 ?11001100110 ??
03 ?# ?# ??03 ?10010011000 ??
04 ?$ ?$ ??04 ?10010001100 ??
05 ?% ?% ??05 ?10001001100 ??
06 ?& ?& ??06 ?10011001000 ??
07 ?/'? /' ??07 ?10011000100 ??
08 ?( ?( ??08 ?10001100100 ??
09 ?) ?) ??09 ?11001001000 ??
10 ?* ?* ??10 ?11001000100 ??
11 ?+ ?+ ??11 ?11000100100 ??
12 ?,? , ??12 ?10110011100 ??
13 ?- ?- ??13 ?10011011100 ??
14 ?. ?. ??14 ?10011001110 ??
15 ?/ ?/ ??15 ?10111001100 ??
16 ?0 ?0 ??16 ?10011101100 ??
17 ?1?1 ??17 ?10011100110 ??
18 ?2?2 ??18 ?11001110010 ??
19 ?3 ?3 ??19 ?11001011100 ??
20 ?4 ?4 ??20 ?11001001110 ??
21 ?5?5 ??21 ?11011100100 ??
22 ?6?6 ??22 ?11001110100 ??
23 ?7 ?7 ??23 ?11101101110 ??
24 ?8?8 ??24 ?11101001100 ??
25 ?9 ?9 ??25 ?11100101100 ??
26 ?: ?: ??26 ?11100100110 ??
27 ?; ?; ??27 ?11101100100 ??
28 ?< ?< ??28 ?11100110100 ??
29 ?= ?= ??29 ?11100110010 ??
30 ?> ?> ??30 ?11011011000 ??
31 ?? ?? ??31 ?11011000110 ??
32 ?@ ?@ ??32 ?11000110110 ??
33 ?A ?A ??33 ?10100011000 ??
34 ?B ?B ??34 ?10001011000 ??
35 ?C ?C ??35 ?10001000110 ??
36 ?D ?D ??36 ?10110001000 ??
37 ?E ?E ??37 ?10001101000 ??
38 ?F ?F ??38 ?10001100010 ??
39 ?G ?G ??39 ?11010001000 ??
40 ?H ?H ??40 ?11000101000 ??
41 ?I ?I ??41 ?11000100010 ??
42 ?J ?J ??42 ?10110111000 ??
43 ?K ?K ??43 ?10110001110 ??
44 ?L ?L ??44 ?10001101110 ??
45 ?M ?M ??45 ?10111011000 ??
46 ?N ?N ??46 ?10111000110 ??
47 ?O ?O ??47 ?10001110110 ??
48 ?P ?P ??48 ?11101110110 ??
49 ?Q ?Q ??49 ?11010001110 ??
50 ?R ?R ??50 ?11000101110 ??
51 ?S ?S ??51 ?11011101000 ??
52 ?T ?T ??52 ?11011100010 ???
53 ?U ?U ??53 ?11011101110
54 ?V ?V ??54 ?11101011000
55 ?W ?W ??55 ?11101000110
56 ?X ?X ??56 ?11100010110
57 ?Y ?Y ??57 ?11101101000
58 ?Z ?Z ??58 ?11101100010
59 ?[ ?[ ??59 ?11100011010
60 ?// ?// ??60 ?11101111010
61 ?] ?] ??61 ?11001000010
62 ?^ ?^ ??62 ?11110001010
63 ?_ ?_ ??63 ?10100110000
64 ?NUL ?` ??64 ?10100001100
65 ?SOH ?a ??65 ?10010110000
66 ?STX ?b ??66 ?10010000110
67 ?ETX ?c ??67 ?10000101100
68 ?EOT ?d ??68 ?10000100110
69 ?ENQ ?e ??69 ?10110010000
70 ?ACK ?f ??70 ?10110000100
71 ?BEL ?g ??71 ?10011010000
72 ?BS ?h ??72 ?10011000010
73 ?HT ?I ??73 ?10000110100
74 ?LF ?j ??74 ?10000110010
75 ?VT ?k ??75 ?11000010010
76 ?FF ?l ??76 ?11001010000
76 ?FF ?l ??76 ?11001010000
77 ?CR ?m ??77 ?11110111010
78 ?SO ?n ??78 ?11000010100
79 ?SI ?o ??79 ?10001111010
80 ?DLE ?p ??80 ?10100111100
81 ?DC1 ?q ??81 ?10010111100
82 ?DC2 ?r ??82 ?10010011110
83 ?DC3 ?s ??83 ?10111100100
84 ?DC4 ?t ??84 ?10011110100
85 ?NAK ?u ??85 ?10011110010
86 ?SYN ?v ??86 ?11110100100
87 ?ETB ?w ??87 ?11110010100
88 ?CAN ?x ??88 ?11110010010
89 ?EM ?y ??89 ?11011011110
90 ?SUB ?z ??90 ?11011110110
91 ?ESC ?{ ??91 ?11110110110
92 ?FS ?| ??92 ?10101111000
93 ?GS ?} ??93 ?10100011110
94 ?RS ?~ ??94 ?10001011110
95 ?US ?DEL ??95 ?10111101000
96 ?FNC3 ?FNC3 ??96 ?10111100010
97 ?FNC2 ?FNC2 ??97 ?11110101000
98 ?SHIFT ?SHIFT ??98 ?11110100010
99 ?CodeC ?CodeC ??99 ?10111011110
100 ?CodeB ?FNC4 ??CodeB ?10111101110
101 ?FNC4 ?CodeA ??CodeA ?11101011110
102 ?FNC1 ?FNC1 ??FNC1 ?11110101110
103 ?STARTA ?STARTA ??STARTA ?11010000100
104 ?STARTB ?STARTB ??STARTB ?11010010000
105 ?STARTC ?STARTC ??STARTC ?11010011100
終止符?STOP ?STOP ??STOP ?1100011101011
編程實現,創建一個二維數組表,把編碼表存入,數組第0列A碼,第1列B碼,第2列C碼,第3列bandcode,第4列對就二進制編碼值,整體算法十分簡單,把要編碼的內容讀入,按照下表轉為二進制編碼值,生成數據位,最后按照規則,開始位+[FNC1(為 EAN128 碼時附加)]+數據位+校驗位+結束位組合成完整二進制編碼數據,最后調用平臺GUI函數按照合成的完整二進制碼,1對應白色豎線,0對應黑色豎線繪制出來,線高和線寬可以根據需要調整,下面給出完整的JAVA代碼和android代碼,java繪圖使用AWT圖形庫。
public class TestCode128C {String[][] code128 = { { " ", " ", "00", "212222", "11011001100" },{ "!", "!", "01", "222122", "11001101100" },{ "\"", "\"", "02", "222221", "11001100110" },{ "#", "#", "03", "121223", "10010011000" },{ "$", "$", "04", "121322", "10010001100" },{ "%", "%", "05", "131222", "10001001100" },{ "&", "&", "06", "122213", "10011001000" },{ "'", "'", "07", "122312", "10011000100", },{ "(", "(", "08", "132212", "10001100100" },{ ")", ")", "09", "221213", "11001001000" },{ "*", "*", "10", "221312", "11001000100" },{ "+", "+", "11", "231212", "11000100100" },{ ",", ",", "12", "112232", "10110011100" },{ "-", "-", "13", "122132", "10011011100" },{ ".", ".", "14", "122231", "10011001110" },{ "/", "/", "15", "113222", "10111001100" },{ "0", "0", "16", "123122", "10011101100" },{ "1", "1", "17", "123221", "10011100110" },{ "2", "2", "18", "223211", "11001110010", },{ "3", "3", "19", "221132", "11001011100" },{ "4", "4", "20", "221231", "11001001110", },{ "5", "5", "21", "213212", "11011100100" },{ "6", "6", "22", "223112", "11001110100" },{ "7", "7", "23", "312131", "11101101110" },{ "8", "8", "24", "311222", "11101001100" },{ "9", "9", "25", "321122", "11100101100" },{ ":", ":", "26", "321221", "11100100110" },{ ";", ";", "27", "312212", "11101100100" },{ "<", "<", "28", "322112", "11100110100" },{ "=", "=", "29", "322211", "11100110010" },{ ">", ">", "30", "212123", "11011011000" },{ "?", "?", "31", "212321", "11011000110" },{ "@", "@", "32", "232121", "11000110110" },{ "A", "A", "33", "111323", "10100011000" },{ "B", "B", "34", "131123", "10001011000" },{ "C", "C", "35", "131321", "10001000110" },{ "D", "D", "36", "112313", "10110001000" },{ "E", "E", "37", "132113", "10001101000" },{ "F", "F", "38", "132311", "10001100010" },{ "G", "G", "39", "211313", "11010001000" },{ "H", "H", "40", "231113", "11000101000" },{ "I", "I", "41", "231311", "11000100010" },{ "J", "J", "42", "112133", "10110111000" },{ "K", "K", "43", "112331", "10110001110" },{ "L", "L", "44", "132131", "10001101110" },{ "M", "M", "45", "113123", "10111011000" },{ "N", "N", "46", "113321", "10111000110" },{ "O", "O", "47", "133121", "10001110110" },{ "P", "P", "48", "313121", "11101110110" },{ "Q", "Q", "49", "211331", "11010001110" },{ "R", "R", "50", "231131", "11000101110" },{ "S", "S", "51", "213113", "11011101000" },{ "T", "T", "52", "213311", "11011100010" },{ "U", "U", "53", "213131", "11011101110" },{ "V", "V", "54", "311123", "11101011000" },{ "W", "W", "55", "311321", "11101000110" },{ "X", "X", "56", "331121", "11100010110" },{ "Y", "Y", "57", "312113", "11101101000" },{ "Z", "Z", "58", "312311", "11101100010" },{ "[", "[", "59", "332111", "11100011010" },{ "\\", "\\", "60", "314111", "11101111010" },{ "]", "]", "61", "221411", "11001000010" },{ "^", "^", "62", "431111", "11110001010" },{ "_", "_", "63", "111224", "10100110000" },{ "NUL", "`", "64", "111422", "10100001100" },{ "SOH", "a", "65", "121124", "10010110000" },{ "STX", "b", "66", "121421", "10010000110" },{ "ETX", "c", "67", "141122", "10000101100" },{ "EOT", "d", "68", "141221", "10000100110" },{ "ENQ", "e", "69", "112214", "10110010000" },{ "ACK", "f", "70", "112412", "10110000100" },{ "BEL", "g", "71", "122114", "10011010000" },{ "BS", "h", "72", "122411", "10011000010" },{ "HT", "i", "73", "142112", "10000110100" },{ "LF", "j", "74", "142211", "10000110010" },{ "VT", "k", "75", "241211", "11000010010" },{ "FF", "I", "76", "221114", "11001010000" },{ "CR", "m", "77", "413111", "11110111010" },{ "SO", "n", "78", "241112", "11000010100" },{ "SI", "o", "79", "134111", "10001111010" },{ "DLE", "p", "80", "111242", "10100111100" },{ "DC1", "q", "81", "121142", "10010111100" },{ "DC2", "r", "82", "121241", "10010011110" },{ "DC3", "s", "83", "114212", "10111100100" },{ "DC4", "t", "84", "124112", "10011110100" },{ "NAK", "u", "85", "124211", "10011110010" },{ "SYN", "v", "86", "411212", "11110100100" },{ "ETB", "w", "87", "421112", "11110010100" },{ "CAN", "x", "88", "421211", "11110010010" },{ "EM", "y", "89", "212141", "11011011110" },{ "SUB", "z", "90", "214121", "11011110110" },{ "ESC", "{", "91", "412121", "11110110110" },{ "FS", "|", "92", "111143", "10101111000" },{ "GS", "},", "93", "111341", "10100011110" },{ "RS", "~", "94", "131141", "10001011110" },{ "US", "DEL", "95", "114113", "10111101000" },{ "FNC3", "FNC3", "96", "114311", "10111100010" },{ "FNC2", "FNC2", "97", "411113", "11110101000" },{ "SHIFT", "SHIFT", "98", "411311", "11110100010" },{ "CODEC", "CODEC", "99", "113141", "10111011110" },{ "CODEB", "FNC4", "CODEB", "114131", "10111101110" },{ "FNC4", "CODEA", "CODEA", "311141", "11101011110" },{ "FNC1", "FNC1", "FNC1", "411131", "11110101110" },{ "StartA", "StartA", "StartA", "211412", "11010000100" },{ "StartB", "StartB", "StartB", "211214", "11010010000" },{ "StartC", "StartC", "StartC", "211232", "11010011100" },{ "Stop", "Stop", "Stop", "2331112", "1100011101011" }, };/*** 生產Code128的條形碼的code* * @param barCode* @param encode* @return*/public String getCode(String barCode, String encode) {String _Text = "";// 返回的參數List<Integer> _TextNumb = new ArrayList<Integer>();// 2截取位的組合int _Examine = 105; // 首位// 編碼不能是奇數if (!((barCode.length() & 1) == 0))return "";while (barCode.length() != 0) {int _Temp = 0;try {// Code128 編碼必須為數字_Temp = Integer.valueOf(barCode.substring(0, 2));} catch (Exception e) {e.printStackTrace();return "";}// 獲得條紋_Text += getValue(barCode, barCode.substring(0, 2), _Temp);_TextNumb.add(_Temp);// 條碼截取2個就需要去掉用過的前二位barCode = barCode.substring(2);}if (_TextNumb.size() == 0) {return "";}_Text = getValue(_Examine) + _Text; // 獲取開始位for (int i = 0; i != _TextNumb.size(); i++) {_Examine += _TextNumb.get(i) * (i + 1);}_Examine = _Examine % 103; // 獲得校驗位_Text += getValue(_Examine); // 獲取校驗位_Text += "1100011101011"; // 結束位return _Text;}/*** 根據編號獲得條紋* * @param encode* @param p_Value* @param p_SetID* @return*/private String getValue(String encode, String p_Value, int p_SetID) {return code128[p_SetID][4];}// / <summary>// / 根據編號獲得條紋// / </summary>// / <param name="p_CodeId"></param>// / <returns></returns>private String getValue(int p_CodeId) {return code128[p_CodeId][4];}private int m_nImageHeight = 40; // 條碼的高度像素數public static void main(String[] args) throws Exception {TestCode128C c = new TestCode128C();String barCode = c.getCode("118842807789", "");c.kiCode128C(barCode, 500, "D:/code128C.jpg");}// / <summary>// / 生成條碼// / </summary>// / <param name="BarString">條碼模式字符串</param>// / <param name="Height">生成的條碼高度</param>// / <returns>條碼圖形</returns>public void kiCode128C(String barString, int Height, String path) {try {//File myPNG = new File(path);m_nImageHeight = Height;OutputStream out = new FileOutputStream(path);if (null == barString || null == out || 0 == barString.length())return;int nImageWidth = 0;char[] cs = barString.toCharArray();for (int i = 0; i != cs.length; i++) { nImageWidth = cs.length*10;}BufferedImage bi = new BufferedImage(nImageWidth, m_nImageHeight,BufferedImage.TYPE_INT_RGB);Graphics g = bi.getGraphics();for (int i = 0; i < cs.length; i++) {if ("1".equals(cs[i] + "")) {g.setColor(Color.BLACK);g.fillRect(i*10, 0, 10, m_nImageHeight);} else {g.setColor(Color.WHITE);g.fillRect(i*10, 0, 10, m_nImageHeight);}}//JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);//encoder.encode(bi);ImageIO.write(bi, "jpg", out);out.close();} catch (Exception e) {e.printStackTrace();}}}在android上繪出條形碼供機器自動化使用
總結
以上是生活随笔為你收集整理的android编程实现128条形码的生成和识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu下用apache+perl搭
- 下一篇: C++11 多线程库使用说明