程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#生成Code39(extend)條形碼【非條形碼字體】,

C#生成Code39(extend)條形碼【非條形碼字體】,

編輯:C#入門知識

C#生成Code39(extend)條形碼【非條形碼字體】,


Code39是條形碼的一種。由於編制簡單、能夠對任意長度的數據進行編碼、支持設備廣泛等特性而被廣泛采用。

  1. 能夠對任意長度的數據進行編碼。其局限在於印刷品的長度和條碼閱讀器的識別范圍。
  2. 支持設備廣泛。目前幾乎所有的條形碼閱讀設備都能閱讀Code39碼,打印機也是同樣情況。
  3. 編制簡單。簡單的開發技術就能快速生成相應的編碼圖像。
  4. 一般Code39碼由5條線和分開它們的4條縫隙共9個元素構成。線和縫隙有寬窄之分,而且無論線還是縫隙僅有3個比其他的元素要寬一定比例。39碼因此得名

Code39條形碼規則

  1、 每五條線表示一個字符;   2、 粗線表示1,細線表示0;   3、 線條間的間隙寬的表示1,窄的表示0;   4、 五條線加上它們之間的四條間隙就是九位二進制編碼,而且這九位中必定有三位是1,所以稱為39碼;   5、 條形碼的首尾各一個 * 標識開始和結束。   Code 39只接受如下43個有效輸入字符:
  1、26個大寫字母(A - Z),
  2、十個數字(0 - 9),
  3、連接號(-),句號(.),空格,美圓符號($),斜扛(/),加號(+)以及百分號(%)。
    4、其余的輸入將被忽略。
  5、code39通常情況下不需要校驗碼。但是對於精確度要求高的應用,需要在code39條形碼後面增加一個校驗碼。   條形碼的生成網上也有很多庫文件,做的特別好的都是商業授權。一維碼二維碼在.net開源項目中的生成讀取比較知名的有:Zxing.net(http://zxingnet.codeplex.com/)、BarcodeLib等 但有些時候開源軟件所實現的並不滿足當下的需求,所以還要做一些其他嘗試。效果如下圖:   代碼分享:
 /// <summary>
    /// Code39一維碼生成類
    /// http://www.cnblogs.com/bluescreen/p/4689351.html
    /// </summary>
    public class CSharpCode39
    {

        #region 數據碼
        private byte[,] c39_bp = new byte[,] { 
            { 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x30 }, { 0x31, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31 }, { 0x32, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31 }, { 0x33, 0x31, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30 }, { 0x34, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x31 }, { 0x35, 0x31, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 0x36, 0x30, 0x30, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 0x37, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31 }, { 0x38, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x39, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x41, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31 }, { 0x42, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31 }, { 0x43, 0x31, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30 }, { 0x44, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x31 }, { 0x45, 0x31, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30 }, { 70, 0x30, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30 }, 
            { 0x47, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x31 }, { 0x48, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30 }, { 0x49, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30 }, { 0x4a, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x30, 0x30 }, { 0x4b, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31 }, { 0x4c, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31 }, { 0x4d, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30 }, { 0x4e, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x31 }, { 0x4f, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30 }, { 80, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30 }, { 0x51, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31 }, { 0x52, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30 }, { 0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30 }, { 0x54, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30 }, { 0x55, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31 }, { 0x56, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31 }, 
            { 0x57, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30 }, { 0x58, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31 }, { 0x59, 0x31, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 90, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 0x2d, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31 }, { 0x2e, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x20, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x2a, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30 }, { 0x24, 0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30 }, { 0x2f, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30 }, { 0x2b, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30 }, { 0x25, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30 }
         };
        //code39合法字符集 [0-9A-Z+-*/%. ] 共43個
        private byte[] c39_cw = new byte[] { 
            0x30, 0x31, 50, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 70, 
            0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 80, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 
            0x57, 0x58, 0x59, 90, 0x2d, 0x2e, 0x20, 0x24, 0x2f, 0x2b, 0x25
         };
        private byte[,] c39_ex = new byte[,] { 
            { 1, 0x24, 0x41 }, { 2, 0x24, 0x42 }, { 3, 0x24, 0x43 }, { 4, 0x24, 0x44 }, { 5, 0x24, 0x45 }, { 6, 0x24, 70 }, { 7, 0x24, 0x47 }, { 8, 0x24, 0x48 }, { 9, 0x24, 0x49 }, { 10, 0x24, 0x4a }, { 11, 0x24, 0x4b }, { 12, 0x24, 0x4c }, { 13, 0x24, 0x4d }, { 14, 0x24, 0x4e }, { 15, 0x24, 0x4f }, { 0x10, 0x24, 80 }, 
            { 0x11, 0x24, 0x51 }, { 0x12, 0x24, 0x52 }, { 0x13, 0x24, 0x53 }, { 20, 0x24, 0x54 }, { 0x15, 0x24, 0x55 }, { 0x16, 0x24, 0x56 }, { 0x17, 0x24, 0x57 }, { 0x18, 0x24, 0x58 }, { 0x19, 0x24, 0x59 }, { 0x1a, 0x24, 90 }, { 0x1b, 0x25, 0x41 }, { 0x1c, 0x25, 0x42 }, { 0x1d, 0x25, 0x43 }, { 30, 0x25, 0x44 }, { 0x1f, 0x25, 0x45 }, { 0x3b, 0x25, 70 }, 
            { 60, 0x25, 0x47 }, { 0x3d, 0x25, 0x48 }, { 0x3e, 0x25, 0x49 }, { 0x3f, 0x25, 0x4a }, { 0x5b, 0x25, 0x4b }, { 0x5c, 0x25, 0x4c }, { 0x5d, 0x25, 0x4d }, { 0x5e, 0x25, 0x4e }, { 0x5f, 0x25, 0x4f }, { 0x7b, 0x25, 80 }, { 0x7c, 0x25, 0x51 }, { 0x7d, 0x25, 0x52 }, { 0x7e, 0x25, 0x53 }, { 0x7f, 0x25, 0x54 }, { 0, 0x25, 0x55 }, { 0x40, 0x25, 0x56 }, 
            { 0x60, 0x25, 0x57 }, { 0x21, 0x2f, 0x41 }, { 0x22, 0x2f, 0x42 }, { 0x23, 0x2f, 0x43 }, { 0x26, 0x2f, 70 }, { 0x27, 0x2f, 0x47 }, { 40, 0x2f, 0x48 }, { 0x29, 0x2f, 0x49 }, { 0x2a, 0x2f, 0x4a }, { 0x2c, 0x2f, 0x4c }, { 0x3a, 0x2f, 90 }, { 0x61, 0x2b, 0x41 }, { 0x62, 0x2b, 0x42 }, { 0x63, 0x2b, 0x43 }, { 100, 0x2b, 0x44 }, { 0x65, 0x2b, 0x45 }, 
            { 0x66, 0x2b, 70 }, { 0x67, 0x2b, 0x47 }, { 0x68, 0x2b, 0x48 }, { 0x69, 0x2b, 0x49 }, { 0x6a, 0x2b, 0x4a }, { 0x6b, 0x2b, 0x4b }, { 0x6c, 0x2b, 0x4c }, { 0x6d, 0x2b, 0x4d }, { 110, 0x2b, 0x4e }, { 0x6f, 0x2b, 0x4f }, { 0x70, 0x2b, 80 }, { 0x71, 0x2b, 0x51 }, { 0x72, 0x2b, 0x52 }, { 0x73, 0x2b, 0x53 }, { 0x74, 0x2b, 0x54 }, { 0x75, 0x2b, 0x55 }, 
            { 0x76, 0x2b, 0x56 }, { 0x77, 0x2b, 0x57 }, { 120, 0x2b, 0x58 }, { 0x79, 0x2b, 0x59 }, { 0x7a, 0x2b, 90 }
         };
        #endregion
        #region 字段和屬性



        private bool _checksum;
        private string _dataToEncode;
        private bool _humanReadable;
        private string _humanReadableFont;
        private float _humanReadableSize;
        private float _marginX;
        private float _marginY;
        private float _moduleHeight;
        private float _moduleWidth;
        private float _ratio;
        private float _reduction;
        private Color _codeBarColor = Color.Black;
        private bool _isDisplayCheckCode;
        private string _checkData;
        private bool _isDisplayStartStopSign;
        /// <summary>
        /// 是否檢查效驗
        /// </summary>
        public bool Checksum
        {
            get
            {
                return _checksum;
            }
            set
            {
                _checksum = value;
            }
        }


        /// <summary>
        /// 要進行編碼的數據
        /// </summary>
        public string DataToEncode
        {
            get
            {
                return _dataToEncode;
            }
            set
            {
                _dataToEncode = value;
            }
        }



        /// <summary>
        /// 是否顯示文本內容
        /// </summary>
        public bool HumanReadable
        {
            get
            {
                return _humanReadable;
            }
            set
            {
                _humanReadable = value;
            }
        }
        /// <summary>
        /// 用於顯示文本內容的字體
        /// </summary>
        public string HumanReadableFont
        {
            get
            {
                return _humanReadableFont;
            }
            set
            {
                _humanReadableFont = value;
            }
        }
        /// <summary>
        /// 用於顯示文本內容文字的代大小 
        /// </summary>
        public float HumanReadableSize
        {
            get
            {
                return _humanReadableSize;
            }
            set
            {
                _humanReadableSize = value;
            }
        }

        /// <summary>
        /// 水平方向邊距
        /// 水平方向建議盡量留白
        /// 如果沒有留白同時模塊寬度較小可能會造成無法識別
        /// </summary>
        public float MarginX
        {
            get
            {
                return _marginX;
            }
            set
            {
                _marginX = value;
            }
        }
        /// <summary>
        /// 垂直方向邊距
        /// </summary>
        public float MarginY
        {
            get
            {
                return _marginY;
            }
            set
            {
                _marginY = value;
            }
        }

        /// <summary>
        /// 模塊高度(mm)
        /// </summary>
        public float ModuleHeight
        {
            get
            {
                return _moduleHeight;
            }
            set
            {
                _moduleHeight = value;
            }
        }

        /// <summary>
        /// 模塊寬度(mm)
        /// 模塊寬度不應低於0.2646f
        /// 模塊寬度過低會造成數據丟失因而讀不出數據或者會誤讀
        /// </summary>
        public float ModuleWidth
        {
            get
            {
                return _moduleWidth;
            }
            set
            {
                _moduleWidth = value;
            }
        }


        /// <summary>
        /// 放大比率 
        /// </summary>
        public float Ratio
        {
            get
            {
                return _ratio;
            }
            set
            {
                _ratio = value;
            }
        }
        /// <summary>
        /// 縮小
        /// </summary>
        public float Reduction
        {
            get
            {
                return _reduction;
            }
            set
            {
                _reduction = value;
            }
        }
        /// <summary>
        /// 設置條形碼的顏色
        /// </summary>
        public Color CodeBarColor
        {
            get
            {
                return _codeBarColor;
            }
            set
            {
                _codeBarColor = value;
            }
        }

        /// <summary>
        /// 是否顯示效驗碼
        /// 此屬性要在Checksum屬性為true的情況下有用
        /// </summary>
        public bool IsDisplayCheckCode
        {
            get { return this._isDisplayCheckCode; }
            set { this._isDisplayCheckCode = value; }
        }
        /// <summary>
        /// 供人識別是否顯示起止符
        /// </summary>
        public bool IsDisplayStartStopSign
        {
            get { return this._isDisplayStartStopSign; }
            set { this._isDisplayStartStopSign = value; }
        }
        #endregion
        /// <summary>
        /// 默認構造函數
        /// 初始化
        /// </summary>
        public CSharpCode39()
        {
            this.initData();
            
        }
        public CSharpCode39(string dataToEncode)
        {
            this.initData();
            this._dataToEncode = dataToEncode;
        }
        /// <summary>
        /// 默認構造函數
        /// 初始化數據
        /// </summary>
        private void initData()
        {
            this._humanReadableFont = "Arial";
            this._humanReadableSize = 10f;
            this._codeBarColor = Color.Black;
            this._moduleHeight = 15f;//模塊高度毫米
            this._moduleWidth = 0.35f;//模塊寬度毫米
            this._ratio = 3f;
            this._marginX =2;
            this._marginY =2;
            this._checksum = true;
            this._isDisplayCheckCode = false;
            this._isDisplayStartStopSign = false;
        }
        private char[] _bitpattern_c39(string rawdata, ref int finalLength)
        {
            //0x27  39  
            //0x50  80
            if ((rawdata.Length == 0) || (rawdata.Length > 0x50 /*0x27*/))
            {
                return null;
            }
            for (int i = 0; i < rawdata.Length; i++)
            {
                if ((rawdata[i] == '\0') || (rawdata[i] > '\x007f'))
                {
                    return null;
                }
            }
            byte[] data = processTilde(rawdata);
            if (data.Length == 0)
            {
                return null;
            }
            byte[] buffer2 = this.processExtended(data);
            if ((buffer2.Length == 0) || (buffer2.Length > /*40*/80))
            {
                return null;
            }
            finalLength = this._checksum ? ((buffer2.Length + 2) + 1) : (buffer2.Length + 2);
            return this.getPattern_c39(buffer2);
        }


        /// <summary>
        /// 計算效驗值
        /// </summary>
        /// <param name="data"></param>
        /// <param name="len"></param>
        /// <returns></returns>
        private byte _checksum_c39(byte[] data, int len)
        {
            //0x2b 43
            //字符值的總和除以合法字符集的個數43 取余數   余數在合法字符數組中對應的數值就是效驗值
            int num2 = 0;
            for (int i = 1; i < len; i++)
            {
                num2 += this.valueFromCharacter(data[i]);
            }
            return this.c39_cw[num2 % 0x2b];
        }

        private char[] Code39_bitpattern(string dataToEncode)
        {
            int finalLength = 0;
            return this._bitpattern_c39(dataToEncode, ref finalLength);
        }
        /// <summary>
        /// 獲得Code39條碼圖片
        /// </summary>
        /// <param name="resolution">DPI</param>
        /// <returns></returns>
        public Bitmap getBitmapImage(float resolution)
        {
           return Code39_createCode(resolution);
        }
       
        private Bitmap Code39_createCode(float resolution)
        {
            int num6;
            int finalLength = 0;
            char[] chArray = this._bitpattern_c39(DataToEncode, ref finalLength);
            if (chArray == null)
            {
                return null;
            }
            float fontsize = this._humanReadable ? (0.3527778f * this._humanReadableSize) : 0f;
            // float num3 = (7f * ModuleWidth) + ((3f * Ratio) * ModuleWidth);
            float num3 = (7f * this._moduleWidth) + ((3f * this._ratio) * this._moduleWidth);
            float width = (finalLength * num3) + (2f * this._marginX);
            float height = (this._moduleHeight + (2f * this._marginY)) + fontsize;
            width *= resolution / 25.4f;
            height *= resolution / 25.4f;
            Bitmap image = new Bitmap((int)width, (int)height, PixelFormat.Format32bppPArgb);
            image.SetResolution(resolution, resolution);
            //image.SetResolution(300, 300);
            Graphics g = Graphics.FromImage(image);
            g.Clear(Color.White);
            g.PageUnit = GraphicsUnit.Millimeter; //以毫米為度量單位
            g.FillRectangle(new SolidBrush(Color.White), new Rectangle(0, 0, /*(int)width*/image.Width, /*(int)height*/image.Height));
            //new Pen(Color.Black, 2f);
            //new SolidBrush(Color.White);
            SolidBrush brush = new SolidBrush(Color.Black);
            if (resolution < 300f)
            {
                //g.TextRenderingHint = TextRenderingHint.AntiAlias;
                //g.SmoothingMode = SmoothingMode.AntiAlias;
                g.CompositingQuality = CompositingQuality.HighQuality;
                //g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
            }
            float num7 = 0f;
            for (num6 = 0; num6 < chArray.Length; num6++)
            {
                if (chArray[num6] == '0')
                {
                    if ((num6 & 1) != 1)
                    {
                        RectangleF rect = new RectangleF(MarginX + num7, MarginY, ModuleWidth, ModuleHeight);
                        MakeBar(g, rect, Reduction);
                    }
                    num7 += 1f * ModuleWidth;
                }
                else
                {
                    if ((num6 & 1) != 1)
                    {
                        RectangleF ef2 = new RectangleF(MarginX + num7, MarginY, Ratio * ModuleWidth, ModuleHeight);
                        MakeBar(g, ef2, Reduction);
                    }
                    num7 += Ratio * ModuleWidth;
                }
            }

            #region  供人識別內容
            if (this._humanReadable)
            {
                #region 保留
                /*byte[] buffer2 = processTilde(this._dataToEncode);
                int index = 0;
                List<byte> arr = new List<byte>();
                for (num6 = 0; num6 < buffer2.Length; num6++)
                {
                    //0x20 32      0x7e  126
                    if ((buffer2[num6] >= 0x20) && (buffer2[num6] <= 0x7e))
                    {
                        arr.Add(buffer2[num6]);
                    }
                }
                byte[] bytes = new byte[arr.Count];
                for (int i = 0; i < arr.Count; i++)
                {
                    bytes[i] = arr[i];
                }
                index = arr.Count;
                
                //string text = new ASCIIEncoding().GetString(bytes, 0, index);
                 */ 
                #endregion
                string text = this._dataToEncode;
                if (this._isDisplayCheckCode&&!string.IsNullOrEmpty(this._checkData)) {
                    text += this._checkData;
                }
                if (this._isDisplayStartStopSign)
                {
                    text = "*" + text + "*";
                }
                Font font = new Font(this._humanReadableFont, this._humanReadableSize);
                //g.DrawString(text, font, brush, new PointF(MarginX, MarginY + ModuleHeight));
                //新增字符串格式
                var drawFormat = new StringFormat { Alignment = StringAlignment.Center };
                float inpix = image.Width / resolution;//根據DPi求出 英寸數
                float widthmm = inpix * 25.4f;   //有每英寸像素求出毫米
                //g.DrawString(text, font, Brushes.Black, width / 2, height - 14, drawFormat);
                g.DrawString(text, font, /*Brushes.Black*/brush, new PointF(/*MarginX*/(int)(widthmm / 2), MarginY + ModuleHeight + 1), drawFormat);

            }

            #endregion



            return image;
        }

        /// <summary>
        /// 進行圖形填充
        /// </summary>
        /// <param name="g"></param>
        /// <param name="rect"></param>
        /// <param name="reduction"></param>
        private void MakeBar(Graphics g, RectangleF rect, float reduction)
        {
            MakeBar(g, rect, reduction,this._codeBarColor);
        }

        /// <summary>
        /// 進行圖形填充
        /// </summary>
        /// <param name="g"></param>
        /// <param name="rect"></param>
        /// <param name="reduction"></param>
        /// <param name="brushColor"></param>
        private void MakeBar(Graphics g, RectangleF rect, float reduction, Color brushColor)
        {
            float num = rect.Width * (reduction / 200f);
            float num2 = rect.Width - (rect.Width * (reduction / 200f));

            RectangleF ef = new RectangleF
            {
                X = rect.X + num,
                Y = rect.Y,
                Width = num2,
                Height = rect.Height
            };
            SolidBrush brush = new SolidBrush(brushColor);
            g.FillRectangle(brush, ef);

        }

        private char[] getPattern_c39(byte[] data)
        {   //0x2a  42為*
            //int num = 0x27;
            int num = 80;
            byte[] buffer = new byte[num + 1];
            buffer[0] = 0x2a;
            int index = 1;
            for (int i = 0; i < data.Length; i++)
            {
                buffer[index] = data[i];
                index++;
            }
            if (Checksum)
            {
                buffer[index] = this._checksum_c39(buffer, index);
                if (_isDisplayCheckCode)
                {
                    this._checkData = ((char)buffer[index]).ToString();
                }
                index++;
            }
            buffer[index] = 0x2a;
            index++;
            char[] chArray = new char[index * 10];
            int num5 = 0;
            for (int j = 0; j < index; j++)
            {
                byte c = buffer[j];
                int num9 = this.indexFromCharacter(c);
                for (int k = 0; k < 9; k++)
                {
                    chArray[num5] = (char)this.c39_bp[num9, k + 1];
                    num5++;
                }
                chArray[num5] = '0';
                num5++;
            }
            return chArray;
        }

        private int indexFromCharacter(byte c)
        {
            //0x2c==44
            for (int i = 0; i < 0x2c; i++)
            {
                if (this.c39_bp[i, 0] == c)
                {
                    return i;
                }
            }
            return -1;
        }


        private byte[] processExtended(byte[] data)
        {
            //0x25  38
            //0x4F  79 0x4E 78
            //int num = 0x4F;
            int num = data.Length - 1;
            byte[] sourceArray = new byte[num + 1];
            int index = 0;
            for (int i = 0; i < data.Length; i++)
            {
                byte c = data[i];
                if (this.valueFromCharacter(c) != -1)
                {
                    sourceArray[index] = c;
                    index++;
                }
                else
                {
                    byte num5 = 0;
                    byte num6 = 0;
                    if (this.valuesFromExtended(c, ref num5, ref num6))
                    {
                        sourceArray[index] = num5;
                        sourceArray[index + 1] = num6;
                        index += 2;
                    }
                }
            }
            byte[] destinationArray = new byte[index];
            Array.Copy(sourceArray, destinationArray, index);
            return destinationArray;
        }

        /// <summary>
        /// 返回指定字符在code39合法字符數組中對應的索引
        /// </summary>
        /// <param name="c"></param>
        /// <returns></returns>
        private int valueFromCharacter(byte c)
        {
            //c39_cw為數組,保存的為合法的字符集信息[0-9A-Z+-*/%. ] 共43個
            //如果存在這個字符就返回c39_cw對應的索引
            for (int i = 0; i < /*0x2b*/this.c39_cw.Length; i++)
            {
                if (this.c39_cw[i] == c)
                {
                    return i;
                }
            }
            return -1;
        }

        /// <summary>
        /// 判斷字符集是否存在Extended
        /// </summary>
        /// <param name="c"></param>
        /// <param name="v1"></param>
        /// <param name="v2"></param>
        /// <returns></returns>
        private bool valuesFromExtended(byte c, ref byte v1, ref byte v2)
        {
            //0x55  85
            for (int i = 0; i < 0x55; i++)
            {
                if (this.c39_ex[i, 0] == c)
                {
                    v1 = this.c39_ex[i, 1];
                    v2 = this.c39_ex[i, 2];
                    return true;
                }
            }
            return false;
        }

        private byte[] processTilde(string rawdata)
        {
            byte[] sourceArray = new byte[rawdata.Length];
            int index = 0;
            for (int i = 0; i < rawdata.Length; i++)
            {
                if (rawdata[i] != '~')
                {
                    sourceArray[index] = (byte)rawdata[i];
                    index++;
                }
                else if ((i + 3) < rawdata.Length)
                {
                    string str = new string(new char[] { rawdata[i + 1], rawdata[i + 2], rawdata[i + 3] });
                    int num3 = Convert.ToInt32(str, 10);
                    if ((num3 > 0) && (num3 <= 0xff))
                    {
                        sourceArray[index] = (byte)num3;
                        index++;
                    }
                    if (num3 == 0x3e7)
                    {
                        sourceArray[index] = 0x86;
                        index++;
                    }
                    i += 3;
                }
                else
                {
                    sourceArray[index] = (byte)rawdata[i];
                    index++;
                }
            }
            byte[] destinationArray = new byte[index];
            Array.Copy(sourceArray, destinationArray, index);
            return destinationArray;
        }
    }

 

 這個方法是根據DPI以及數據模塊的高寬來確定條碼的實際高寬。模塊的寬度以毫米(mm)來算。類中的getBitmapImage方法的一個參數getBitmapImage為DPI。安卓用戶安裝平時常用的掃碼軟件即可做識別測試。就識別率來說還是可以的,掃描槍絕對是可以掃的出的。同時使用過MessagingToolkit.Barcode進行解碼測試,萬張無一誤讀。

 

在線解碼網站:http://cli.im/deqr/、http://www.fbqr.com/desQR#

 WinForm的例子下載:點擊下載DEMO

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved