Code128码简介

Code128码于1981年推出,是一种长度可变、连续性的字母数字条码。与其他一维条码比较起来,相对较为复杂,支持的字元也相对较多,又有不同的编码方式可供交互运用,因此其应用弹性也较大。
Code128特性:
1、具有A、B、C三种不同的编码类型,可提供标准ASCII中128个字元的编码使用;
2、允许双向扫描;
3、可自行决定是否加上检验位;
4、条码长度可调,但包括开始位和结束位在内,不可超过232个字元;
5、同一个128码,可以由A、B、C三种不同编码规则互换,既可扩大字元选择的范围,也可缩短编码的长度。

Code128各编码方式的编码范围:
1、Code128A:标准数字和字母,控制符,特殊字符;
2、Code128B:标准数字和字母,小写字母,特殊字符;
3、Code128C/EAN128:[00]-[99]的数字对集合,共100个,即只能表示偶数位长度的数字。
Code128编码规则:开始位 + [FNC1(为EAN128码时加)] + 数据位 + 检验位 + 结束位
Code128检验位计算:(开始位对应的ID值 + 每位数据在整个数据中的位置×每位数据对应的ID值)% 103

Code128编码示例:
以 95270078 为例
Code128A, 开始位对应的ID为103,第1位数据9对应的ID为25,第2位数据5对应的ID为21,依此类推,可以计算检验位 = (103 + 125 + 221 + 318 + 423 + 516 + 616 + 723 + 824) % 103 = 21,即检验位的ID为21。

对照编码表,95270078 编码表示为:开始位StartA(bbsbssssbss)+ 数据位[9(bbbssbsbbss)+ 5(bbsbbbssbss)+ 2(bbssbbbssbs)+ 7(bbbsbbsbbbs)+ 0(bssbbbsbbss)+ 0(bssbbbsbbss)+ 7(bbbsbbsbbbs)+ 8(bbbsbssbbss)]+ 检验位21(bbsbbbssbss)+ 结束位Stop(bbsssbbbsbsbb), 即:bbsbssssbssbbbssbsbbssbbsbbbssbssbbssbbbssbsbbbsbbsbbbsbssbbbsbbssbssbbbsbbssbbbsbbsbbbsbbbsbssbbssbbsbbbssbssbbsssbbbsbsbb。 若要打印,只需将b用黑色线标出,s用白色线标出,一个简单的条形码生成程序就完成了!

128B 与128A类似,128C只能对长度为偶数的数字串编码,每两个数字为一位,所以输出的信息压缩了一半,打印的条形码因此也就较短。接上例,第1位数据 95对应ID为95,第2位数据27对应ID为27,第3位数据00对应ID为0,第4位数据78对应ID为78,所以检验位 = (105 + 195 + 227 + 30 + 478) % 103 = 51

EAN128与Code128C相同,只是在开始位后加多一个控制位FNC1(ID为102),同时将FNC1做为第1位数据加入到检验位的计算。

总结

编码方式 开始位 FNC1 数据位 检验位 结束位 编码结果
Code128A StartA 9+5+2+7+0+0+7+8 (103+125+221+318+423+516+616+723+824)%103=21 Stop bbsbssssbssbbbssbsbbssbbsbbbssbssbbssbbbssbsbbbsbbsbbbsbssbbbsbbssbssbbbsbbssbbbsbbsbbbsbbbsbssbbssbbsbbbssbssbbsssbbbsbsbb
Code128B StartB 9+5+2+7+0+0+7+8 (104+125+221+318+423+516+616+723+824)%103=22 Stop bbsbssbssssbbbssbsbbssbbsbbbssbssbbssbbbssbsbbbsbbsbbbsbssbbbsbbssbssbbbsbbssbbbsbbsbbbsbbbsbssbbssbbssbbbsbssbbsssbbbsbsbb
Code128C StartC 95 + 27 + 00 + 78 (105 + 195 + 227 + 30 + 478) % 103 = 51 Stop bbsbssbbbssbsbbbbsbsssbbbsbbssbssbbsbbssbbssbbssssbsbssbbsbbbsbsssbbsssbbbsbsbb
EAN128 StartC FNC1 95 + 27 + 00 + 78 (105 + 1102 + 295 + 327 + 40 + 5*78) % 103 = 44 Stop bbsbssbbbssbbbbsbsbbbsbsbbbbsbsssbbbsbbssbssbbsbbssbbssbbssssbsbssbsssbbsbbbsbbsssbbbsbsbb

C#程序的编写

先建立一个新的from工程,在设计界面分别拖放lable、button、textbox和picturebox控件到主窗体。

1、添加Code128码类

class C_Code128{private DataTable m_Code128 = new DataTable();private uint m_Height = 40;/// <summary>/// 高度/// </summary>public uint Height { get { return m_Height; } set { m_Height = value; } }private Font m_ValueFont = null;/// <summary>/// 是否显示可见号码  如果为NULL不显示号码/// </summary>public Font ValueFont { get { return m_ValueFont; } set { m_ValueFont = value; } }private byte m_Magnify = 0;/// <summary>/// 放大倍数/// </summary>public byte Magnify { get { return m_Magnify; } set { m_Magnify = value; } }/// <summary>/// 条码类别/// </summary>public enum Encode{Code128A,Code128B,Code128C,EAN128}public C_Code128(){m_Code128.Columns.Add("ID");m_Code128.Columns.Add("Code128A");m_Code128.Columns.Add("Code128B");m_Code128.Columns.Add("Code128C");m_Code128.Columns.Add("BandCode");m_Code128.CaseSensitive = true;#region 数据表m_Code128.Rows.Add("0", " ", " ", "00", "212222");m_Code128.Rows.Add("1", "!", "!", "01", "222122");m_Code128.Rows.Add("2", "\"", "\"", "02", "222221");m_Code128.Rows.Add("3", "#", "#", "03", "121223");m_Code128.Rows.Add("4", "$", "$", "04", "121322");m_Code128.Rows.Add("5", "%", "%", "05", "131222");m_Code128.Rows.Add("6", "&", "&", "06", "122213");m_Code128.Rows.Add("7", "'", "'", "07", "122312");m_Code128.Rows.Add("8", "(", "(", "08", "132212");m_Code128.Rows.Add("9", ")", ")", "09", "221213");m_Code128.Rows.Add("10", "*", "*", "10", "221312");m_Code128.Rows.Add("11", "+", "+", "11", "231212");m_Code128.Rows.Add("12", ",", ",", "12", "112232");m_Code128.Rows.Add("13", "-", "-", "13", "122132");m_Code128.Rows.Add("14", ".", ".", "14", "122231");m_Code128.Rows.Add("15", "/", "/", "15", "113222");m_Code128.Rows.Add("16", "0", "0", "16", "123122");m_Code128.Rows.Add("17", "1", "1", "17", "123221");m_Code128.Rows.Add("18", "2", "2", "18", "223211");m_Code128.Rows.Add("19", "3", "3", "19", "221132");m_Code128.Rows.Add("20", "4", "4", "20", "221231");m_Code128.Rows.Add("21", "5", "5", "21", "213212");m_Code128.Rows.Add("22", "6", "6", "22", "223112");m_Code128.Rows.Add("23", "7", "7", "23", "312131");m_Code128.Rows.Add("24", "8", "8", "24", "311222");m_Code128.Rows.Add("25", "9", "9", "25", "321122");m_Code128.Rows.Add("26", ":", ":", "26", "321221");m_Code128.Rows.Add("27", ";", ";", "27", "312212");m_Code128.Rows.Add("28", "<", "<", "28", "322112");m_Code128.Rows.Add("29", "=", "=", "29", "322211");m_Code128.Rows.Add("30", ">", ">", "30", "212123");m_Code128.Rows.Add("31", "?", "?", "31", "212321");m_Code128.Rows.Add("32", "@", "@", "32", "232121");m_Code128.Rows.Add("33", "A", "A", "33", "111323");m_Code128.Rows.Add("34", "B", "B", "34", "131123");m_Code128.Rows.Add("35", "C", "C", "35", "131321");m_Code128.Rows.Add("36", "D", "D", "36", "112313");m_Code128.Rows.Add("37", "E", "E", "37", "132113");m_Code128.Rows.Add("38", "F", "F", "38", "132311");m_Code128.Rows.Add("39", "G", "G", "39", "211313");m_Code128.Rows.Add("40", "H", "H", "40", "231113");m_Code128.Rows.Add("41", "I", "I", "41", "231311");m_Code128.Rows.Add("42", "J", "J", "42", "112133");m_Code128.Rows.Add("43", "K", "K", "43", "112331");m_Code128.Rows.Add("44", "L", "L", "44", "132131");m_Code128.Rows.Add("45", "M", "M", "45", "113123");m_Code128.Rows.Add("46", "N", "N", "46", "113321");m_Code128.Rows.Add("47", "O", "O", "47", "133121");m_Code128.Rows.Add("48", "P", "P", "48", "313121");m_Code128.Rows.Add("49", "Q", "Q", "49", "211331");m_Code128.Rows.Add("50", "R", "R", "50", "231131");m_Code128.Rows.Add("51", "S", "S", "51", "213113");m_Code128.Rows.Add("52", "T", "T", "52", "213311");m_Code128.Rows.Add("53", "U", "U", "53", "213131");m_Code128.Rows.Add("54", "V", "V", "54", "311123");m_Code128.Rows.Add("55", "W", "W", "55", "311321");m_Code128.Rows.Add("56", "X", "X", "56", "331121");m_Code128.Rows.Add("57", "Y", "Y", "57", "312113");m_Code128.Rows.Add("58", "Z", "Z", "58", "312311");m_Code128.Rows.Add("59", "[", "[", "59", "332111");m_Code128.Rows.Add("60", "\\", "\\", "60", "314111");m_Code128.Rows.Add("61", "]", "]", "61", "221411");m_Code128.Rows.Add("62", "^", "^", "62", "431111");m_Code128.Rows.Add("63", "_", "_", "63", "111224");m_Code128.Rows.Add("64", "NUL", "`", "64", "111422");m_Code128.Rows.Add("65", "SOH", "a", "65", "121124");m_Code128.Rows.Add("66", "STX", "b", "66", "121421");m_Code128.Rows.Add("67", "ETX", "c", "67", "141122");m_Code128.Rows.Add("68", "EOT", "d", "68", "141221");m_Code128.Rows.Add("69", "ENQ", "e", "69", "112214");m_Code128.Rows.Add("70", "ACK", "f", "70", "112412");m_Code128.Rows.Add("71", "BEL", "g", "71", "122114");m_Code128.Rows.Add("72", "BS", "h", "72", "122411");m_Code128.Rows.Add("73", "HT", "i", "73", "142112");m_Code128.Rows.Add("74", "LF", "j", "74", "142211");m_Code128.Rows.Add("75", "VT", "k", "75", "241211");m_Code128.Rows.Add("76", "FF", "I", "76", "221114");m_Code128.Rows.Add("77", "CR", "m", "77", "413111");m_Code128.Rows.Add("78", "SO", "n", "78", "241112");m_Code128.Rows.Add("79", "SI", "o", "79", "134111");m_Code128.Rows.Add("80", "DLE", "p", "80", "111242");m_Code128.Rows.Add("81", "DC1", "q", "81", "121142");m_Code128.Rows.Add("82", "DC2", "r", "82", "121241");m_Code128.Rows.Add("83", "DC3", "s", "83", "114212");m_Code128.Rows.Add("84", "DC4", "t", "84", "124112");m_Code128.Rows.Add("85", "NAK", "u", "85", "124211");m_Code128.Rows.Add("86", "SYN", "v", "86", "411212");m_Code128.Rows.Add("87", "ETB", "w", "87", "421112");m_Code128.Rows.Add("88", "CAN", "x", "88", "421211");m_Code128.Rows.Add("89", "EM", "y", "89", "212141");m_Code128.Rows.Add("90", "SUB", "z", "90", "214121");m_Code128.Rows.Add("91", "ESC", "{", "91", "412121");m_Code128.Rows.Add("92", "FS", "|", "92", "111143");m_Code128.Rows.Add("93", "GS", "}", "93", "111341");m_Code128.Rows.Add("94", "RS", "~", "94", "131141");m_Code128.Rows.Add("95", "US", "DEL", "95", "114113");m_Code128.Rows.Add("96", "FNC3", "FNC3", "96", "114311");m_Code128.Rows.Add("97", "FNC2", "FNC2", "97", "411113");m_Code128.Rows.Add("98", "SHIFT", "SHIFT", "98", "411311");m_Code128.Rows.Add("99", "CODEC", "CODEC", "99", "113141");m_Code128.Rows.Add("100", "CODEB", "FNC4", "CODEB", "114131");m_Code128.Rows.Add("101", "FNC4", "CODEA", "CODEA", "311141");m_Code128.Rows.Add("102", "FNC1", "FNC1", "FNC1", "411131");m_Code128.Rows.Add("103", "StartA", "StartA", "StartA", "211412");m_Code128.Rows.Add("104", "StartB", "StartB", "StartB", "211214");m_Code128.Rows.Add("105", "StartC", "StartC", "StartC", "211232");m_Code128.Rows.Add("106", "Stop", "Stop", "Stop", "2331112");#endregion}/// <summary>/// 获取128图形/// </summary>/// <param name="p_Text">文字</param>/// <param name="p_Code">编码</param>      /// <returns>图形</returns>public Bitmap GetCodeImage(string p_Text, Encode p_Code){string _ViewText = p_Text;string _Text = "";IList<int> _TextNumb = new List<int>();int _Examine = 0;  //首位switch (p_Code){case Encode.Code128C:_Examine = 105;if (!((p_Text.Length & 1) == 0)) throw new Exception("128C长度必须是偶数");while (p_Text.Length != 0){int _Temp = 0;try{int _CodeNumb128 = Int32.Parse(p_Text.Substring(0, 2));}catch{throw new Exception("128C必须是数字!");}_Text += GetValue(p_Code, p_Text.Substring(0, 2), ref _Temp);_TextNumb.Add(_Temp);p_Text = p_Text.Remove(0, 2);}break;case Encode.EAN128:_Examine = 105;if (!((p_Text.Length & 1) == 0)) throw new Exception("EAN128长度必须是偶数");_TextNumb.Add(102);_Text += "411131";while (p_Text.Length != 0){int _Temp = 0;try{int _CodeNumb128 = Int32.Parse(p_Text.Substring(0, 2));}catch{throw new Exception("128C必须是数字!");}_Text += GetValue(Encode.Code128C, p_Text.Substring(0, 2), ref _Temp);_TextNumb.Add(_Temp);p_Text = p_Text.Remove(0, 2);}break;default:if (p_Code == Encode.Code128A){_Examine = 103;}else{_Examine = 104;}while (p_Text.Length != 0){int _Temp = 0;string _ValueCode = GetValue(p_Code, p_Text.Substring(0, 1), ref _Temp);if (_ValueCode.Length == 0) throw new Exception("无效的字符集!" + p_Text.Substring(0, 1).ToString());_Text += _ValueCode;_TextNumb.Add(_Temp);p_Text = p_Text.Remove(0, 1);}break;}if (_TextNumb.Count == 0) throw new Exception("错误的编码,无数据");_Text = _Text.Insert(0, GetValue(_Examine)); //获取开始位for (int i = 0; i != _TextNumb.Count; i++){_Examine += _TextNumb[i] * (i + 1);}_Examine = _Examine % 103;           //获得严效位_Text += GetValue(_Examine);  //获取严效位_Text += "2331112"; //结束位Bitmap _CodeImage = GetImage(_Text);GetViewText(_CodeImage, _ViewText);return _CodeImage;}/// <summary>/// 获取目标对应的数据/// </summary>/// <param name="p_Code">编码</param>/// <param name="p_Value">数值 A b  30</param>/// <param name="p_SetID">返回编号</param>/// <returns>编码</returns>private string GetValue(Encode p_Code, string p_Value, ref int p_SetID){if (m_Code128 == null) return "";DataRow[] _Row = m_Code128.Select(p_Code.ToString() + "='" + p_Value + "'");if (_Row.Length != 1) throw new Exception("错误的编码" + p_Value.ToString());p_SetID = Int32.Parse(_Row[0]["ID"].ToString());return _Row[0]["BandCode"].ToString();}/// <summary>/// 根据编号获得条纹/// </summary>/// <param name="p_CodeId"></param>/// <returns></returns>private string GetValue(int p_CodeId){DataRow[] _Row = m_Code128.Select("ID='" + p_CodeId.ToString() + "'");if (_Row.Length != 1) throw new Exception("验效位的编码错误" + p_CodeId.ToString());return _Row[0]["BandCode"].ToString();}/// <summary>/// 获得条码图形/// </summary>/// <param name="p_Text">文字</param>/// <returns>图形</returns>private Bitmap GetImage(string p_Text){char[] _Value = p_Text.ToCharArray();int _Width = 0;for (int i = 0; i != _Value.Length; i++){_Width += Int32.Parse(_Value[i].ToString()) * (m_Magnify + 1);}Bitmap _CodeImage = new Bitmap(_Width, (int)m_Height);Graphics _Garphics = Graphics.FromImage(_CodeImage);//Pen _Pen;int _LenEx = 0;for (int i = 0; i != _Value.Length; i++){int _ValueNumb = Int32.Parse(_Value[i].ToString()) * (m_Magnify + 1);  //获取宽和放大系数if (!((i & 1) == 0)){//_Pen = new Pen(Brushes.White, _ValueNumb);_Garphics.FillRectangle(Brushes.White, new Rectangle(_LenEx, 0, _ValueNumb, (int)m_Height));}else{//_Pen = new Pen(Brushes.Black, _ValueNumb);_Garphics.FillRectangle(Brushes.Black, new Rectangle(_LenEx, 0, _ValueNumb, (int)m_Height));}//_Garphics.(_Pen, new Point(_LenEx, 0), new Point(_LenEx, m_Height));_LenEx += _ValueNumb;}_Garphics.Dispose();return _CodeImage;}/// <summary>/// 显示可见条码文字 如果小于40 不显示文字/// </summary>/// <param name="p_Bitmap">图形</param>           private void GetViewText(Bitmap p_Bitmap, string p_ViewText){if (m_ValueFont == null) return;Graphics _Graphics = Graphics.FromImage(p_Bitmap);SizeF _DrawSize = _Graphics.MeasureString(p_ViewText, m_ValueFont);if (_DrawSize.Height > p_Bitmap.Height - 10 || _DrawSize.Width > p_Bitmap.Width){_Graphics.Dispose();return;}int _StarY = p_Bitmap.Height - (int)_DrawSize.Height;_Graphics.FillRectangle(Brushes.White, new Rectangle(0, _StarY, p_Bitmap.Width, (int)_DrawSize.Height));_Graphics.DrawString(p_ViewText, m_ValueFont, Brushes.Black, 0, _StarY);}//12345678//(105 + (1 * 12 + 2 * 34 + 3 * 56 + 4 *78)) % 103 = 47//结果为starc +12 +34 +56 +78 +47 +endinternal Image GetCodeImage(string p){throw new NotImplementedException();}}

2、在C#from窗体中生成按钮Click事件

private void btn_general_Click(object sender, EventArgs e){string str = textBox1.Text;if (str == ""){pictureBox1.Image = null;return;}C_Code128 _Code = new C_Code128();_Code.ValueFont = new Font("宋体", 10);System.Drawing.Bitmap imgTemp = _Code.GetCodeImage(str,C_Code128.Encode.Code128A);string path = System.AppDomain.CurrentDomain.BaseDirectory + "\\" + str + "_" +DateTime.Now.Millisecond.ToString() + ".gif";imgTemp.Save(path , System.Drawing.Imaging.ImageFormat.Gif);pictureBox1.Image = Image.FromFile(path);}}

结论
在输入框中输入字符串,点击按钮就会生成相应的Code128码,并显示在界面中。效果图如下:

C#Code128条形码生成相关推荐

  1. C#生成Code128条形码

    C生成Code128条形码 Code128码简介 C程序的编写 1添加Code128码类 2在Cfrom窗体中生成按钮Click事件 结论 C#生成Code128条形码 Code128码简介 Code ...

  2. JAVA生成code128条形码

    JAVA生成code128条形码 引入maven坐标 <dependency><groupId>net.sf.barcode4j</groupId><arti ...

  3. wps js生成条形码,批量生成code128条形码小标签并导出为pdf文件

    最近从vba转到js宏,以前写vba可以引用BarcodeX控件生成条形码,但我不知道怎么在wps js环境引用第三方控件,所以只能用Shapes.AddPicture方法插入条形码图片,这里利用bw ...

  4. php+条形码在线怎么生成,php实现生成code128条形码的方法详解

    本文实例讲述了php实现生成code128条形码的方法.分享给大家供大家参考,具体如下: 效果图: class BarCode128 { const STARTA = 103; const START ...

  5. python3 生成条形码_python3转换code128条形码的方法

    这年头如果用 python3 做条形码的,肯定(推荐)用 pystrich . 这货官方文档貌似都没写到支持 code128 ,但是居然有这个类( code128encoder).... 一些喷墨打印 ...

  6. Java条形码生成技术-Barcode4j

    背景 目前二维码的应用场景已经遍布各类互联网平台,通常是将产品/商品的唯一编号存储于二维码中以做扫码识别. 而用于生产环境的条形码技术仍然存在,如硬件设备制造.供应.物流运输等等. 在常见的产品信息管 ...

  7. python3识别条码_python3转换code128条形码的方法

    这年头如果用 python3 做条形码的,肯定(推荐)用 pystrich . 这货官方文档貌似都没写到支持 Code128 ,但是居然有这个类( Code128Encoder).... 一些喷墨打印 ...

  8. Java条形码生成-Barcode4j

    背景 目前二维码的应用场景已经遍布各类互联网平台,通常是将产品/商品的唯一编号存储于二维码中以做扫码识别. 而用于生产环境的条形码技术仍然存在,如硬件设备制造.供应.物流运输等等. 在常见的产品信息管 ...

  9. 条形码识别软件linux,条形码生成和识别库 Aspose.BarCode

    Aspose.BarCode 是一个的条形码生成和识别库.支持29种条形码类型,包括:MSI, QR, OneCode, Australia Post, Aztec, Code128, Code11, ...

  10. 如何看懂Code128条形码

    如何看懂Code128条形码 1.条形码种类很多,常见的大概有二十多种码制,其中包括: Code39码(标准39码).Codabar码(库德巴码).Code25码(标准25码).ITF25码(交叉25 ...

最新文章

  1. 骆利群院士最新Science综述:神经环路架构,激发新的AI
  2. Java Lock接口分析之ReentantReadWriteLock
  3. Postman使用方法示例
  4. python联盟是什么意思_Python 与 英雄联盟(1)
  5. DP Big Event in HDU
  6. Python数据库连接池DBUtils
  7. VMware 常见使用问题梳理
  8. 【Python】IDE环境Pycharm运行虚拟环境Django
  9. 如何使用TreeView控件
  10. java脚本封号_java中如何踢人下线?封禁某个账号后使其会话立即掉线!
  11. Java基础面试题集(二)
  12. 简明firewalld不断的更新中....
  13. 颜色选择器(拾色器)
  14. 耐磨钢球磨耗计算方法
  15. 电脑重装系统后播放视频卡顿怎么办
  16. Localization of Classified Objects in SLAM using NonparametricStatistics and Clustering(2018,IROS)
  17. java ldap 父_Java LDAP操作
  18. Excel怎么实现分类自动编号
  19. 极端行情下,如何通过期权做好风险管理? | TI对话首席
  20. 关于大数据的八大热点问题

热门文章

  1. Android Studio 占用C盘空间太大
  2. 将.fits数据转换为.png图像
  3. FPGA状态机跑飞 的解决办法
  4. 关于梯度下降与Momentum通俗易懂的解释
  5. android 按键 设置在哪,如何在Android设备上设置按键和按键?
  6. 最新苹果商务管理ABM注册及使用
  7. 一元三次方程求解c语言
  8. 第二节课 上身肌肉锻炼
  9. iOS之HomeKit
  10. 期货十三篇 第九篇 心态篇