.NET条形码

时间:2023-03-08 21:42:36

建议不要用CODE-39码,改用CODE-128码;

CODE-39码密度比较低,条码数字内容太多,导致条码太长,缩短长度就只能减小X尺寸,造成识读困难;

CODE-128码密度高,相同的数字生成条码更短。

你可以对比一下图中的两个条码,上面是CODE-39,下面是CODE-128,相同的内容:

aaarticlea/png;base64,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xKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGPxKOFWiJjbdplZ1o8CuLRQRGP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" alt="" />

解决方案:

aaarticlea/png;base64,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" alt="" />

Default.aspx

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="BarcodeTest.Default" %>

 <!DOCTYPE html>

 <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>条形码</title>
<script type="text/javascript" src="jquery-latest.min.js"></script>
<script type="text/javascript">
$(function () {
$("#btnBar").click(function () {
var rawData = $.trim($("#txtRawData").val());
$("#imgBarcode").attr("src", "BarcodeHandler.ashx?RawData=" + rawData + "&BarHeight=50&BarcodeType=" + $("#ddlBarcodeType").val()
+ "&IsDisplayFontData=" + ($("#cbIsDisplayFontData").attr("checked") == "checked") + "&FontSize=" + $("#txtFontSize").val() + "&FontAlignment=" + $("#ddlFontAlignment").get(0).selectedIndex);
});
});
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
原始码:
<input type="text" id="txtRawData" maxlength="48" value="BJ-BJSJF-GCSG-0004-HTFY00002" />
<br />
编码选择:<select id="ddlBarcodeType"><option>Auto</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
</div>
<br />
字体大小:<input type="text" id="txtFontSize" value="16" />字体布局:<select id="ddlFontAlignment"><option>Near</option>
<option selected="selected">Center</option>
<option>Far</option>
</select><input checked="checked" type="checkbox" id="cbIsDisplayFontData" />字体显示
<div>
<input type="button" id="btnBar" value="生成条形码" />
</div>
<div style="text-align: center;">
<img id="imgBarcode" src="" alt="条形码" />
</div>
</form>
</body>
</html>

BarcodeHandler.ashx

 using Barcode;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace BarcodeTest
{
/// <summary>
/// author: Kenmu
/// created by: 2014-11-06
/// function: 条形码生成
/// </summary>
public class BarcodeHandler : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{
HttpRequest request = context.Request;
HttpResponse response = context.Response;
response.ClearContent();
response.ContentType = "image/jpeg"; string barcodeType = request["BarcodeType"] ?? "Auto";
string rawData = request["RawData"] ?? ((char)).ToString() + @"123a" + ((char)).ToString() + "ab";
byte barHeight = byte.Parse(string.IsNullOrEmpty(request["BarHeight"]) ? "" : request["BarHeight"]);
bool isDisplayFontData = string.IsNullOrEmpty(request["IsDisplayFontData"]) ? true : bool.Parse(request["IsDisplayFontData"]);
int fontSize = string.IsNullOrEmpty(request["FontSize"]) ? : int.Parse(request["FontSize"]);
int fontAlignment = string.IsNullOrEmpty(request["FontAlignment"]) ? : int.Parse(request["FontAlignment"]);//0(Near左)、1(Center中)、2(Far右)
BaseCode128 code128;
switch (barcodeType)
{
case "A":
code128 = new Code128A(rawData);
break;
case "B":
code128 = new Code128B(rawData);
break;
case "C":
code128 = new Code128C(rawData);
break;
case "Auto":
default:
code128 = new Code128Auto(rawData);
break;
}
code128.BarHeight = barHeight;
code128.IsDisplayFontData = isDisplayFontData;
code128.FontSize = fontSize;
code128.FontAlignment = (System.Drawing.StringAlignment)fontAlignment; System.Drawing.Image img = code128.GetBarCodeImage();
img.Save(response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
img.Dispose();
} public bool IsReusable
{
get
{
return false;
}
}
}
}

CharacterSet.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; //author: Kenmu
//created by: 2014-11-05
//function: 条形码
namespace Barcode
{
/// <summary>
/// Code128字符集
/// </summary>
internal enum CharacterSet
{
A,
B,
C
}
}

IBarCode.cs

 using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text; //author: Kenmu
//created by: 2014-11-05
//function: 条形码
namespace Barcode
{
/// <summary>
/// 条形码接口
/// </summary>
public interface IBarCode
{
string RawData { get; }
/// <summary>
/// 条形码对应的数据
/// </summary>
string EncodedData { get; }
/// <summary>
/// 当前条形码标准
/// </summary>
string BarCodeType { get; } /// <summary>
/// 得到条形码对应的图片
/// </summary>
/// <returns></returns>
Image GetBarCodeImage();
}
}

BaseCode128.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing; //author: Kenmu
//created by: 2014-11-06
//function: 条形码
namespace Barcode
{
/// <summary>
/// BaseCode128抽象类
/// </summary>
public abstract class BaseCode128 : IBarCode
{
protected Color backColor = Color.White;//条码背景色
protected Color barColor = Color.Black;//条码和原始数据字体颜色 /// <summary>
/// 当前条形码种类
/// </summary>
public string BarCodeType
{
get { return System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name; }
} /// <summary>
/// 条形码对应的编码数据
/// </summary>
protected string _EncodedData;
public string EncodedData
{
get { return this._EncodedData; }
} /// <summary>
/// 【原始数据】
/// </summary>
protected string _RawData;
public string RawData
{
get { return this._RawData; }
} /// <summary>
/// 在条形码下面显示数据;如果为空,则取【原始数据】
/// </summary>
protected string _PresentationData = null;
public string PresentationData
{
get { return string.IsNullOrEmpty(this._PresentationData) ? this._RawData : this._PresentationData; }
} /// <summary>
/// 条码单位宽度;单位Pix,默认为1
/// </summary>
protected byte _BarCellWidth = ;
public byte BarCellWidth
{
get { return this._BarCellWidth; }
set
{
if (value == )
{
this._BarCellWidth = ;
}
else
{
this._BarCellWidth = value;
}
}
} /// <summary>
/// 条码高度,必须至少是条码宽度的0.15倍或6.35mm,两者取大者;默认按照实际为32,单位mm
/// </summary>
protected byte _BarHeight = ;
public byte BarHeight
{
get { return this._BarHeight; }
set
{
this._BarHeight = value;
}
} /// <summary>
/// 是否在条形码下面显示【原始数据】
/// </summary>
protected bool _IsDisplayFontData = true;
public bool IsDisplayFontData
{
get { return this._IsDisplayFontData; }
set { this._IsDisplayFontData = value; }
} /// <summary>
/// 【原始数据】与条形码的空间间隔;单位Pix,默认为4
/// </summary>
protected byte _FontPadding = ;
public byte FontPadding
{
get { return this._FontPadding; }
set { this._FontPadding = value; }
} /// <summary>
/// 【原始数据】字体大小;单位Pix,默认为16
/// </summary>
protected float _FontSize = ;
public float FontSize
{
get { return this._FontSize; }
set { this._FontSize = value; }
} /// <summary>
/// 【原始数据】字体布局位置;默认水平居中
/// </summary>
protected StringAlignment _FontAlignment = StringAlignment.Center;
public StringAlignment FontAlignment
{
get { return this._FontAlignment; }
set { this._FontAlignment = value; }
} public BaseCode128(string rawData)
{
this._RawData = rawData;
if (string.IsNullOrEmpty(this._RawData))
{
throw new Exception("空字符串无法生成条形码");
}
this._RawData = this._RawData.Trim();
if (!this.RawDataCheck())
{
throw new Exception(rawData + " 不符合 " + this.BarCodeType + " 标准");
}
this._EncodedData = this.GetEncodedData();
} protected int GetBarCodePhyWidth()
{
//在212222这种BS单元下,要计算bsGroup对应模块宽度的倍率
//应该要将总长度减去1(因为Stop对应长度为7),然后结果乘以11再除以6,与左右空白相加后再加上2(Stop比正常的BS多出2个模块组)
int bsNum = (this._EncodedData.Length - ) * / + ;
return bsNum * this._BarCellWidth;
} /// <summary>
/// 数据输入正确性验证
/// </summary>
/// <returns></returns>
protected abstract bool RawDataCheck(); /// <summary>
/// 获取当前Data对应的编码数据(条空组合)
/// </summary>
/// <returns></returns>
protected abstract string GetEncodedData(); /// <summary>
/// 获取完整的条形码
/// </summary>
/// <returns></returns>
public Image GetBarCodeImage()
{
Image barImage = this.GetBarOnlyImage();
int width = barImage.Width;
int height = barImage.Height;
if (this._IsDisplayFontData)
{
height += this._FontPadding + (int)this._FontSize;
} Image image = new Bitmap(width, height);
Graphics g = Graphics.FromImage(image);
g.Clear(this.backColor);
g.DrawImage(barImage, , , barImage.Width, barImage.Height); if (this._IsDisplayFontData)
{
Font drawFont = new Font(new FontFamily("Times New Roman"), this._FontSize, FontStyle.Regular, GraphicsUnit.Pixel);
Brush drawBrush = new SolidBrush(this.barColor);
StringFormat drawFormat = new StringFormat();
drawFormat.Alignment = this._FontAlignment;
RectangleF reF = new RectangleF(, barImage.Height + this._FontPadding, width, this._FontSize);
g.DrawString(this.PresentationData, drawFont, drawBrush, reF, drawFormat); drawFont.Dispose();
drawBrush.Dispose();
drawFormat.Dispose();
} System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
//结束绘制
g.Dispose();
image.Dispose();
return Image.FromStream(ms);
}
/// <summary>
/// 获取仅包含条形码的图像
/// </summary>
/// <returns></returns>
private Image GetBarOnlyImage()
{
int width = (int)this.GetBarCodePhyWidth();
Bitmap image = new Bitmap(width, this._BarHeight);
int ptr = ;
for (int i = ; i < this._EncodedData.Length; i++)
{
int w = (int)char.GetNumericValue(this._EncodedData[i]);
w *= this._BarCellWidth;
Color c = i % == ? this.barColor : this.backColor;
for (int j = ; j < w; j++)
{
for (int h = ; h < this._BarHeight; h++)
{
image.SetPixel(ptr, h, c);
}
ptr++;
}
}
return image;
}
}
}

Code128.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions; //author: Kenmu
//created by: 2014-11-05
//function: 条形码
namespace Barcode
{
/// <summary>
/// Code128基础相关类
/// </summary>
public static class Code128
{
/*
* 128 尺寸要求
* 最小模块宽度 x 最大1.016mm,最小0.250mm 一个系统中的x应为一恒定值 标准是1mm,放大系数0.25~1.2
* 左右侧空白区最小宽度为 10x
* 条高通常为32mm,实际可以根据具体要求
*
* 最大物理长度不应超过 165mm,可编码的最大数据字符数为48,其中包括应用标识符和作为分隔符使用的FNC1字符,但不包括辅助字符和校验符
*
* AI中FNC1同样作为分隔符使用
*
* ASCII
* 0~31 StartA 专有
* 96~127 StartB 专有
*
* EAN128不使用空格(ASCII码32)
*/ /// <summary>
/// Code128条空排列集合,1代表条b,0代表空s,Index对应符号字符值S
/// </summary>
internal static readonly List<string> BSList = new List<string>()
{
"" , "" , "" , "" , "" , "" , "" , "" , "" , "" ,
"" , "" , "" , "" , "" , "" , "" , "" , "" , "" ,
"" , "" , "" , "" , "" , "" , "" , "" , "" , "" ,
"" , "" , "" , "" , "" , "" , "" , "" , "" , "" ,
"" , "" , "" , "" , "" , "" , "" , "" , "" , "" ,
"" , "" , "" , "" , "" , "" , "" , "" , "" , "" ,
"" , "" , "" , "" , "" , "" , "" , "" , "" , "" ,
"" , "" , "" , "" , "" , "" , "" , "" , "" , "" ,
"" , "" , "" , "" , "" , "" , "" , "" , "" , "" ,
"" , "" , "" , "" , "" , "" , "" , "" , "" , "" ,
"" , "" , "" , "" , "" , "" , ""
}; internal const byte FNC3_AB = , FNC2_AB = , SHIFT_AB = , CODEC_AB = , CODEB_AC = , CODEA_BC = ;
internal const byte FNC4_A = , FNC4_B = ;
internal const byte FNC1 = , StartA = , StartB = , StartC = ;
internal const byte Stop = ; /// <summary>
/// 获取字符在字符集A中对应的符号字符值S
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
internal static byte GetSIndexFromA(char c)
{
byte sIndex = (byte)c;
//字符集A中 符号字符值S 若ASCII<32,则 S=ASCII+64 ,若95>=ASCII>=32,则S=ASCII-32
if (sIndex < )
{
sIndex += ;
}
else if (sIndex < )
{
sIndex -= ;
}
else
{
throw new NotImplementedException();
}
return sIndex;
}
/// <summary>
/// 获取字符在字符集B中对应的符号字符值S
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
internal static byte GetSIndexFromB(char c)
{
byte sIndex = (byte)c;
if (sIndex > && sIndex < )
{
sIndex -= ;//字符集B中ASCII码 减去32后就等于符号字符值
}
else
{
throw new NotImplementedException();
}
return sIndex;
}
internal static byte GetSIndex(CharacterSet characterSet, char c)
{
switch (characterSet)
{
case CharacterSet.A:
return GetSIndexFromA(c);
case CharacterSet.B:
return GetSIndexFromB(c);
default:
throw new NotImplementedException();
}
}
/// <summary>
/// 判断指定字符是否仅属于指定字符集
/// </summary>
/// <param name="characterSet"></param>
/// <param name="c"></param>
/// <returns></returns>
internal static bool CharOnlyBelongsTo(CharacterSet characterSet, char c)
{
switch (characterSet)
{
case CharacterSet.A:
return (byte)c < ;
case CharacterSet.B:
return (byte)c > && (byte)c < ;
default:
throw new NotImplementedException();
}
}
/// <summary>
/// 判断指定字符是否不属于指定字符集
/// </summary>
/// <param name="characterSet"></param>
/// <param name="c"></param>
/// <returns></returns>
internal static bool CharNotBelongsTo(CharacterSet characterSet, char c)
{
switch (characterSet)
{
case CharacterSet.A:
return (byte)c > ;
case CharacterSet.B:
return (byte)c < && (byte)c > ;
default:
throw new NotImplementedException();
}
}
/// <summary>
/// 当编码转换时,获取相应的切换符对应的符号字符值
/// </summary>
/// <param name="newCharacterSet"></param>
/// <returns></returns>
internal static byte GetCodeXIndex(CharacterSet newCharacterSet)
{
switch (newCharacterSet)
{
case CharacterSet.A:
return CODEA_BC;
case CharacterSet.B:
return CODEB_AC;
default:
return CODEC_AB;
}
}
/// <summary>
/// 获取转换后的字符集
/// </summary>
/// <param name="characterSet"></param>
/// <returns></returns>
internal static CharacterSet GetShiftCharacterSet(CharacterSet characterSet)
{
switch (characterSet)
{
case CharacterSet.A:
return CharacterSet.B;
case CharacterSet.B:
return CharacterSet.A;
default:
throw new NotImplementedException();
}
}
/// <summary>
/// 获取应采用的字符集
/// </summary>
/// <param name="data"></param>
/// <param name="startIndex">判断开始位置</param>
/// <returns></returns>
internal static CharacterSet GetCharacterSet(string data, int startIndex)
{
CharacterSet returnSet = CharacterSet.B;
if (Regex.IsMatch(data.Substring(startIndex), @"^\d{4,}"))
{
returnSet = CharacterSet.C;
}
else
{
byte byteC = GetProprietaryChar(data, startIndex);
returnSet = byteC < ? CharacterSet.A : CharacterSet.B;
}
return returnSet;
}
/// <summary>
/// 从指定位置开始,返回第一个大于95(并且小于128)或小于32的字符对应的值
/// </summary>
/// <param name="data"></param>
/// <param name="startIndex"></param>
/// <returns>如果没有任何字符匹配,则返回255</returns>
internal static byte GetProprietaryChar(string data, int startIndex)
{
byte returnByte = byte.MaxValue;
for (int i = startIndex; i < data.Length; i++)
{
byte byteC = (byte)data[i];
if (byteC < || byteC > && byteC < )
{
returnByte = byteC;
break;
}
}
return returnByte;
}
/// <summary>
/// 获取字符串从指定位置开始连续出现数字的个数
/// </summary>
/// <param name="data"></param>
/// <param name="startIndex"></param>
/// <returns></returns>
internal static int GetDigitLength(string data, int startIndex)
{
int digitLength = data.Length - startIndex;//默认设定从起始位置开始至最后都是数字
for (int i = startIndex; i < data.Length; i++)
{
if (!char.IsDigit(data[i]))
{
digitLength = i - startIndex;
break;
}
}
return digitLength;
}
}
}

Code128A.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; //author: Kenmu
//created by: 2014-11-05
//function: 条形码
namespace Barcode
{
/// <summary>
/// Code128A条形码,只支持128字符集A(数字、大写字母、控制字符)
/// </summary>
public class Code128A : BaseCode128
{
public Code128A(string rawData)
: base(rawData)
{
} protected override bool RawDataCheck()
{
//128字符集A对应的ASCII码范围为0~95
foreach (char c in this._RawData)
{
byte tempC = (byte)c;
if (tempC <= )
{
continue;
}
else
{
return false;
}
}
return true;
} protected override string GetEncodedData()
{
StringBuilder tempBuilder = new StringBuilder();
tempBuilder.Append(Code128.BSList[Code128.StartA]);//加上起始符StartA
byte sIndex;
int checkNum = Code128.StartA;//校验字符
for (int i = ; i < this._RawData.Length; i++)
{
sIndex = Code128.GetSIndexFromA(this._RawData[i]);
tempBuilder.Append(Code128.BSList[sIndex]);
checkNum += (i + ) * sIndex;
}
checkNum %= ;
tempBuilder.Append(Code128.BSList[checkNum]);//加上校验符
tempBuilder.Append(Code128.BSList[Code128.Stop]);//加上结束符
return tempBuilder.ToString();
}
}
}

Code128Auto.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; //author: Kenmu
//created by: 2014-11-05
//function: 条形码
namespace Barcode
{
/// <summary>
/// Code128Auto条形码,遵循长度最小原则
/// </summary>
public class Code128Auto : BaseCode128
{
public Code128Auto(string rawData)
: base(rawData)
{
} protected override bool RawDataCheck()
{
//Code128对应的ASCII码范围是0~127
foreach (char c in this._RawData)
{
if ((byte)c > )
{
return false;
}
}
return true;
} protected override string GetEncodedData()
{
StringBuilder tempBuilder = new StringBuilder(); CharacterSet nowCharacterSet = Code128.GetCharacterSet(this._RawData, ); int checkNum;//校验字符
switch (nowCharacterSet)
{
case CharacterSet.A:
tempBuilder.Append(Code128.BSList[Code128.StartA]);//加上起始符StartA
checkNum = Code128.StartA;
break;
case CharacterSet.B:
tempBuilder.Append(Code128.BSList[Code128.StartB]);//加上起始符StartB
checkNum = Code128.StartB;
break;
default:
tempBuilder.Append(Code128.BSList[Code128.StartC]);//加上起始符StartC
checkNum = Code128.StartC;
break;
}
int nowWeight = , nowIndex = ;
this.GetEncodedData(tempBuilder, nowCharacterSet, ref nowIndex, ref nowWeight, ref checkNum); checkNum %= ;
tempBuilder.Append(Code128.BSList[checkNum]);//加上校验符
tempBuilder.Append(Code128.BSList[Code128.Stop]);//加上结束符
return tempBuilder.ToString();
}
/// <summary>
/// 通用方法
/// </summary>
/// <param name="tempBuilder"></param>
/// <param name="sIndex"></param>
/// <param name="nowWeight"></param>
/// <param name="checkNum"></param>
private void EncodingCommon(StringBuilder tempBuilder, byte sIndex, ref int nowWeight, ref int checkNum)
{
tempBuilder.Append(Code128.BSList[sIndex]);
checkNum += nowWeight * sIndex;
nowWeight++;
}
/// <summary>
/// 获取编码后的数据
/// </summary>
/// <param name="tempBuilder">编码数据容器</param>
/// <param name="nowCharacterSet">当前字符集</param>
/// <param name="i">字符串索引</param>
/// <param name="nowWeight">当前权值</param>
/// <param name="checkNum">当前检验值总和</param>
private void GetEncodedData(StringBuilder tempBuilder, CharacterSet nowCharacterSet, ref int i, ref int nowWeight, ref int checkNum)
{//因为可能存在字符集C,所以i与nowWeight可能存在不一致关系,所以要分别定义
byte sIndex;
switch (nowCharacterSet)
{
case CharacterSet.A:
case CharacterSet.B:
for (; i < this._RawData.Length; i++)
{
if (char.IsDigit(this._RawData[i]))
{
//数字
int digitLength = Code128.GetDigitLength(this._RawData, i);
if (digitLength >= )
{
//转入CodeC
if (digitLength % != )
{//奇数位数字,在第一个数字之后插入CodeC字符
sIndex = Code128.GetSIndex(nowCharacterSet, (this._RawData[i]));
this.EncodingCommon(tempBuilder, sIndex, ref nowWeight, ref checkNum);
i++;
}
nowCharacterSet = CharacterSet.C;
sIndex = Code128.GetCodeXIndex(nowCharacterSet);//插入CodeC切换字符
this.EncodingCommon(tempBuilder, sIndex, ref nowWeight, ref checkNum);
this.GetEncodedData(tempBuilder, nowCharacterSet, ref i, ref nowWeight, ref checkNum);
return;
}
else
{
//如果小于4位数字,则直接内部循环结束
for (int j = ; j < digitLength; j++)
{
sIndex = Code128.GetSIndex(nowCharacterSet, (this._RawData[i]));
this.EncodingCommon(tempBuilder, sIndex, ref nowWeight, ref checkNum);
i++;
}
i--;//因为上面循环结束后继续外部循环会导致i多加了1,所以要减去1
continue;
}
}
else if (Code128.CharNotBelongsTo(nowCharacterSet, this._RawData[i]))
{//当前字符不属于目前的字符集
byte tempByte = Code128.GetProprietaryChar(this._RawData, i + );//获取当前字符后第一个属于A,或B的字符集
CharacterSet tempCharacterSet = Code128.GetShiftCharacterSet(nowCharacterSet);
if (tempByte != byte.MaxValue && Code128.CharOnlyBelongsTo(nowCharacterSet, (char)tempByte))
{
//加入转换符
sIndex = Code128.SHIFT_AB;
this.EncodingCommon(tempBuilder, sIndex, ref nowWeight, ref checkNum); sIndex = Code128.GetSIndex(tempCharacterSet, this._RawData[i]);
this.EncodingCommon(tempBuilder, sIndex, ref nowWeight, ref checkNum);
continue;
}
else
{
//加入切换符
nowCharacterSet = tempCharacterSet;
sIndex = Code128.GetCodeXIndex(nowCharacterSet);
this.EncodingCommon(tempBuilder, sIndex, ref nowWeight, ref checkNum);
this.GetEncodedData(tempBuilder, nowCharacterSet, ref i, ref nowWeight, ref checkNum);
return;
}
}
else
{
sIndex = Code128.GetSIndex(nowCharacterSet, this._RawData[i]);
this.EncodingCommon(tempBuilder, sIndex, ref nowWeight, ref checkNum);
}
}
break;
default:
for (; i < this._RawData.Length; i += )
{
if (i != this._RawData.Length - && char.IsDigit(this._RawData, i) && char.IsDigit(this._RawData, i + ))
{
sIndex = byte.Parse(this._RawData.Substring(i, ));
this.EncodingCommon(tempBuilder, sIndex, ref nowWeight, ref checkNum);
}
else
{
nowCharacterSet = Code128.GetCharacterSet(this._RawData, i);
//插入转换字符
sIndex = Code128.GetCodeXIndex(nowCharacterSet);
this.EncodingCommon(tempBuilder, sIndex, ref nowWeight, ref checkNum);
this.GetEncodedData(tempBuilder, nowCharacterSet, ref i, ref nowWeight, ref checkNum);
return;
}
}
break;
}
}
}
}

Code128B.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; //author: Kenmu
//created by: 2014-11-05
//function: 条形码
namespace Barcode
{
/// <summary>
/// Code128B条形码,只支持128字符集B(数字、大小字母、字符)
/// </summary>
public class Code128B : BaseCode128
{
public Code128B(string rawData)
: base(rawData)
{
} protected override bool RawDataCheck()
{
//128字符集B对应的ASCII码范围为32~127
foreach (char c in this._RawData)
{
byte tempC = (byte)c;
if (tempC >= && tempC <= )
{
continue;
}
else
{
return false;
}
}
return true;
} protected override string GetEncodedData()
{
StringBuilder tempBuilder = new StringBuilder();
tempBuilder.Append(Code128.BSList[Code128.StartB]);//加上起始符StartB
byte sIndex;
int checkNum = Code128.StartB;//校验字符
for (int i = ; i < this._RawData.Length; i++)
{
sIndex = Code128.GetSIndexFromB(this._RawData[i]);//字符集B中ASCII码 减去32后就等于符号字符值
tempBuilder.Append(Code128.BSList[sIndex]);
checkNum += (i + ) * sIndex;
}
checkNum %= ;
tempBuilder.Append(Code128.BSList[checkNum]);//加上校验符
tempBuilder.Append(Code128.BSList[Code128.Stop]);//加上结束符
return tempBuilder.ToString();
}
}
}

Code128C.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions; //author: Kenmu
//created by: 2014-11-05
//function: 条形码
namespace Barcode
{
/// <summary>
/// Code128C条形码,只支持128字符集C(双位数字)
/// </summary>
public class Code128C : BaseCode128
{
public Code128C(string rawData)
: base(rawData)
{
} protected override bool RawDataCheck()
{
return Regex.IsMatch(this._RawData, @"^\d{2,96}$") && this._RawData.Length % == ;//Code128C 2个数字代表一个数据字符,所以最大可以96个数字
} protected override string GetEncodedData()
{
StringBuilder tempBuilder = new StringBuilder();
tempBuilder.Append(Code128.BSList[Code128.StartC]);//加上起始符StartC
byte sIndex;
int checkNum = Code128.StartC;//校验字符,StartC为105
for (int i = ; i < this._RawData.Length / ; i++)
{
sIndex = byte.Parse(this._RawData.Substring(i * , ));
tempBuilder.Append(Code128.BSList[sIndex]);
checkNum += (i + ) * sIndex;
}
checkNum %= ;
tempBuilder.Append(Code128.BSList[checkNum]);//加上校验符
tempBuilder.Append(Code128.BSList[Code128.Stop]);//加上结束符
return tempBuilder.ToString();
}
}
}

如有需要,请点击下面链接进行下载:

基于128位的条形码Barcode.zip