1. 程式人生 > >C#生成Code39條形碼而非條形碼字型的方法

C#生成Code39條形碼而非條形碼字型的方法

/// <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;
  }
 }

相關推薦

C#生成Code39條形碼條形碼字型方法

/// <summary> /// Code39一維碼生成類 /// http://www.cnblogs.com/bluescreen/p/4689351.html /// </summary> public class CSharpCode39 { #region

幾款好的C/C++編譯器(編譯器IDE)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C/C++編譯器(編譯器IDE)

C/C++開發者必不可少的15款編譯器+IDE C/C++聖戰 大家說的都已經很多了,那麼我在這裡就不羅嗦口了,我著重講下編譯器。 GCC(GNU Compiler Collection) GCC有Windows移植版本,比較出名的就是MinGW

c#生成條形碼

pac space content for enc txt direct line draw 一、生成EAN13的一維碼 // 1.設置條形碼規格 EncodingOptions encodeOption = new EncodingOptions(); encodeOp

C#生成code128條形碼方法

internal 內容 sta 必須 mil 字符串 char bit array 本文實例講述了物流條形碼的C#實現方法,分享一下供大家參考。具體實現方法如下: 主要功能代碼如下:using System; using System.Collections.Generi

史上最簡潔C# 生成條形碼圖片思路及示例分享

else 應用 align current 有一個 += 類別 num namespace 在網上看到一些人寫關於條形碼的代碼都很長,有的甚至拿來賣,所以查了下資料,希望能對大家有幫助。 我的實現原理是: 其實Windows本身就有一個字體是用來顯示條形碼的。 只要將數字

java用JBarcode元件生成條形碼(支援自定義字型及顏色),圖文詳解之2-1

前言: JBarcode入門教程我就不寫了,可以參考:點選開啟連結 我的這篇教程和上篇部落格的不同之處: 1 上篇部落格直接生成二維碼圖片放到d盤的某個資料夾下,我的二維碼生成二維碼後直接用Base64編碼然後返回到前臺頁面。 2 上篇部落格只介紹了生成商品條形碼,其他二維

c# 生成條形碼標識類

using System;using System.IO;using System.Drawing;using System.Web.UI;namespace WebUI.WebControl{ /// <summary> /// Class1 的摘要說明。 //

c#生成二維碼,一維碼(條形碼)

傳統 lin family 底部 之一 提供商 tex 圖像 字節 一、一維碼 1.一維條碼即指條碼條和空的排列規則,常用的一維碼的碼制包括:EAN碼、39碼、交叉25碼、UPC碼、128碼、93碼,ISBN碼,及Codabar(庫德巴碼)等。 2.一維

前端動態生成二維碼與條形碼

二維碼 1.匯入qrcode.js vue專案:在main.js中引入匯入的qrcode.js檔案 import '../static/js/qrcode.js' 在需要顯示二維碼的頁面 <div>      &n

【轉】在VS2010上使用C#呼叫託管C++生成的DLL檔案(圖文講解)

原文:http://www.cyqdata.com/cnblogs/article-detail-35876# 背景       在專案過程中,有時候你需要呼叫非C#編寫的DLL檔案,尤其在使用一些第三方通訊元件的時候,通過C#來開發應用軟體時,就需要利用

Android 生成條形碼 生成下方帶文字的條形碼

可以使用Zxing來獲得條形碼的bitmap. 1.繪製帶有文字的條形碼 由於直接不能繪製出帶有文字的條形碼. 我想到的解決方案是 需要繪製的條形碼的高度的 3/4給條形碼 1/4給文字. 先繪製條形碼 得到bitmap 在建立bitmap 在底部繪製文字,合併兩個bitma

Android 生成豎直方向的條形碼

有橫向的條形碼,也有豎直方向的條形碼. 怎麼把條形碼豎起來呢? 1.旋轉裝著條形碼的view 此方法不可行 因為view的寬高和二維碼的bitmap的寬高是相反的啊.這樣的話即使旋轉了,view裡顯示的圖形會非常小.不行. 2.生成條形碼的bitmap的時候,就要

作為一個c++c程式設計師,該棄函式指標投函式物件了

我想把mqtt的c庫封裝為符合面向物件的形式,其中有個函式是 DLLExport int MQTTClient_setCallbacks(MQTTClient handle, void* context, MQTTClient_connectionLost* cl,

Zxing 生成二維碼和條形碼去掉白邊

原始碼下載: 需求:根據輸入內容,生成條形碼或者二維碼。 我們大多數會選擇Zxing。因為jar包較小。且使用簡單。根據內容生成二維碼的工具類也是一搜一大堆。上面的原始碼裡面也提供了一個。但是我們仔細看了下。會發現。不管生成的是條形碼還是二維碼都會有一部分的白邊。如圖

C#以圖形方式輸出Code128C條形碼

圖形方式輸出Code128C條形碼 最近的專案牽涉到一維條碼列印的問題。條碼的選型上倒沒什麼,因為要求短且僅包含數字,所以決定選用Code128C。在國外的網站上找了點資料研究了下,終於大致搞懂了Code128C的原理和實現方法。 Code128C只能編碼長度是偶數的數字串,

C# NAudio錄音和播放音訊檔案-實時繪製音訊波形圖(從音訊流資料獲取,裝置獲取)

  NAudio的錄音和播放錄音都有對應的類,我在使用Wav格式進行錄音和播放錄音時使用的類時WaveIn和WaveOut,這兩個類是對功能的回撥和一些事件觸發。   在WaveIn和WaveOut之外還有對音訊流讀寫使用的WaveFileWriter和WaveFileReader類,具體細節可檢視其原始碼進

ASP.NET中C#生成二維碼

保存 mss 軟件 clear 所有 str drawing for visual ASP.NET中用C#語言編寫網頁,將自己輸入的文字生成二維碼。 工具/原料 已安裝好VS2010或其他版本VS軟件的電腦一臺 1、新建 1

installed jre指向jdkjre位置&

信息 進行 pyw classpath www alt+ date 內容 檢查  1、eclipse菜單 - Window - Preferences- Java - Installed JREs 將配置的JRE定位到JDK,例如JRE home:D:\Program F

c++生成隨機數

b-s ron 需要 end nbsp rand int stream 默認 生成一個隨機數需要rand()函數來獲得隨機整數,使用rand()函數需要添加頭文件cstdlib。rand()生成的最大數由平臺決定的常輸,在vc++中最大數為32767。 rand()函數生