• 生成条形码


      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Web;
      5 using System.Text;
      6 using System.Drawing;
      7 using System.Text.RegularExpressions;
      8 using System.Collections;
      9 
     10 /// <summary>
     11 ///BarCode 的摘要说明
     12 /// </summary>
     13 
     14 public class BarCodeHelper
     15 {
     16     public static string get39(string s, int width, int height)
     17     {
     18         Hashtable ht = new Hashtable();
     19 
     20         #region 39码 12位
     21         ht.Add('A', "110101001011");
     22         ht.Add('B', "101101001011");
     23         ht.Add('C', "110110100101");
     24         ht.Add('D', "101011001011");
     25         ht.Add('E', "110101100101");
     26         ht.Add('F', "101101100101");
     27         ht.Add('G', "101010011011");
     28         ht.Add('H', "110101001101");
     29         ht.Add('I', "101101001101");
     30         ht.Add('J', "101011001101");
     31         ht.Add('K', "110101010011");
     32         ht.Add('L', "101101010011");
     33         ht.Add('M', "110110101001");
     34         ht.Add('N', "101011010011");
     35         ht.Add('O', "110101101001");
     36         ht.Add('P', "101101101001");
     37         ht.Add('Q', "101010110011");
     38         ht.Add('R', "110101011001");
     39         ht.Add('S', "101101011001");
     40         ht.Add('T', "101011011001");
     41         ht.Add('U', "110010101011");
     42         ht.Add('V', "100110101011");
     43         ht.Add('W', "110011010101");
     44         ht.Add('X', "100101101011");
     45         ht.Add('Y', "110010110101");
     46         ht.Add('Z', "100110110101");
     47         ht.Add('0', "101001101101");
     48         ht.Add('1', "110100101011");
     49         ht.Add('2', "101100101011");
     50         ht.Add('3', "110110010101");
     51         ht.Add('4', "101001101011");
     52         ht.Add('5', "110100110101");
     53         ht.Add('6', "101100110101");
     54         ht.Add('7', "101001011011");
     55         ht.Add('8', "110100101101");
     56         ht.Add('9', "101100101101");
     57         ht.Add('+', "100101001001");
     58         ht.Add('-', "100101011011");
     59         ht.Add('*', "100101101101");
     60         ht.Add('/', "100100101001");
     61         ht.Add('%', "101001001001");
     62         ht.Add('$', "100100100101");
     63         ht.Add('.', "110010101101");
     64         ht.Add(' ', "100110101101");
     65         #endregion
     66         #region 39码 9位
     67         #endregion
     68 
     69         s = s.ToUpper();
     70 
     71         string result_bin = "";//二进制串
     72 
     73         try
     74         {
     75             foreach (char ch in s)
     76             {
     77                 result_bin += ht[ch].ToString();
     78                 result_bin += "0";//间隔,与一个单位的线条宽度相等
     79             }
     80         }
     81         catch { return "存在不允许的字符!"; }
     82 
     83         string result_html = "";//HTML代码
     84         string color = "";//颜色
     85         foreach (char c in result_bin)
     86         {
     87             color = c == '0' ? "#FFFFFF" : "#000000";
     88             result_html += "<div style="" + width + "px;height:" + height + "px;float:left;background:" + color + ";"></div>";
     89         }
     90         result_html += "<div style="clear:both"></div>";
     91 
     92         int len = ht['*'].ToString().Length;
     93         foreach (char c in s)
     94         {
     95             result_html += "<div style="" + (width * (len + 1)) + "px;float:left;color:#000000;text-align:center;">" + c + "</div>";
     96         }
     97         result_html += "<div style="clear:both"></div>";
     98 
     99         return "<div style="background:#FFFFFF;padding:5px;font-size:" + (width * 10) + "px;font-family:'楷体';">" + result_html + "</div>";
    100     }
    101     public static string getEAN13(string s, int width, int height)
    102     {
    103         int checkcode_input = -1;//输入的校验码
    104         if (!Regex.IsMatch(s, @"^d{12}$"))
    105         {
    106             if (!Regex.IsMatch(s, @"^d{13}$"))
    107             {
    108                 return "存在不允许的字符!";
    109             }
    110             else
    111             {
    112                 checkcode_input = int.Parse(s[12].ToString());
    113                 s = s.Substring(0, 12);
    114             }
    115         }
    116 
    117         int sum_even = 0;//偶数位之和
    118         int sum_odd = 0;//奇数位之和
    119 
    120         for (int i = 0; i < 12; i++)
    121         {
    122             if (i % 2 == 0)
    123             {
    124                 sum_odd += int.Parse(s[i].ToString());
    125             }
    126             else
    127             {
    128                 sum_even += int.Parse(s[i].ToString());
    129             }
    130         }
    131 
    132         int checkcode = (10 - (sum_even * 3 + sum_odd) % 10) % 10;//校验码
    133 
    134         if (checkcode_input > 0 && checkcode_input != checkcode)
    135         {
    136             return "输入的校验码错误!";
    137         }
    138 
    139         s += checkcode;//变成13位
    140 
    141         // 000000000101左侧42个01010右侧35个校验7个101000000000
    142         // 6        101左侧6位 01010右侧5位 校验1位101000000000
    143 
    144         string result_bin = "";//二进制串
    145         result_bin += "000000000101";
    146 
    147         string type = ean13type(s[0]);
    148         for (int i = 1; i < 7; i++)
    149         {
    150             result_bin += ean13(s[i], type[i - 1]);
    151         }
    152         result_bin += "01010";
    153         for (int i = 7; i < 13; i++)
    154         {
    155             result_bin += ean13(s[i], 'C');
    156         }
    157         result_bin += "101000000000";
    158 
    159         string result_html = "";//HTML代码
    160         string color = "";//颜色
    161         int height_bottom = width * 5;
    162         foreach (char c in result_bin)
    163         {
    164             color = c == '0' ? "#FFFFFF" : "#000000";
    165             result_html += "<div style="" + width + "px;height:" + height + "px;float:left;background:" + color + ";"></div>";
    166         }
    167         result_html += "<div style="clear:both"></div>";
    168 
    169         result_html += "<div style="float:left;color:#000000;" + (width * 9) + "px;text-align:center;">" + s[0] + "</div>";
    170         result_html += "<div style="float:left;" + width + "px;height:" + height_bottom + "px;background:#000000;"></div>";
    171         result_html += "<div style="float:left;" + width + "px;height:" + height_bottom + "px;background:#FFFFFF;"></div>";
    172         result_html += "<div style="float:left;" + width + "px;height:" + height_bottom + "px;background:#000000;"></div>";
    173         for (int i = 1; i < 7; i++)
    174         {
    175             result_html += "<div style="float:left;" + (width * 7) + "px;color:#000000;text-align:center;">" + s[i] + "</div>";
    176         }
    177         result_html += "<div style="float:left;" + width + "px;height:" + height_bottom + "px;background:#FFFFFF;"></div>";
    178         result_html += "<div style="float:left;" + width + "px;height:" + height_bottom + "px;background:#000000;"></div>";
    179         result_html += "<div style="float:left;" + width + "px;height:" + height_bottom + "px;background:#FFFFFF;"></div>";
    180         result_html += "<div style="float:left;" + width + "px;height:" + height_bottom + "px;background:#000000;"></div>";
    181         result_html += "<div style="float:left;" + width + "px;height:" + height_bottom + "px;background:#FFFFFF;"></div>";
    182         for (int i = 7; i < 13; i++)
    183         {
    184             result_html += "<div style="float:left;" + (width * 7) + "px;color:#000000;text-align:center;">" + s[i] + "</div>";
    185         }
    186         result_html += "<div style="float:left;" + width + "px;height:" + height_bottom + "px;background:#000000;"></div>";
    187         result_html += "<div style="float:left;" + width + "px;height:" + height_bottom + "px;background:#FFFFFF;"></div>";
    188         result_html += "<div style="float:left;" + width + "px;height:" + height_bottom + "px;background:#000000;"></div>";
    189         result_html += "<div style="float:left;color:#000000;" + (width * 9) + "px;"></div>";
    190         result_html += "<div style="clear:both"></div>";
    191 
    192         return "<div style="background:#FFFFFF;padding:0px;font-size:" + (width * 10) + "px;font-family:'楷体';">" + result_html + "</div>";
    193     }
    194     private static string ean13(char c, char type)
    195     {
    196         switch (type)
    197         {
    198             case 'A':
    199                 {
    200                     switch (c)
    201                     {
    202                         case '0': return "0001101";
    203                         case '1': return "0011001";
    204                         case '2': return "0010011";
    205                         case '3': return "0111101";//011101
    206                         case '4': return "0100011";
    207                         case '5': return "0110001";
    208                         case '6': return "0101111";
    209                         case '7': return "0111011";
    210                         case '8': return "0110111";
    211                         case '9': return "0001011";
    212                         default: return "Error!";
    213                     }
    214                 }
    215             case 'B':
    216                 {
    217                     switch (c)
    218                     {
    219                         case '0': return "0100111";
    220                         case '1': return "0110011";
    221                         case '2': return "0011011";
    222                         case '3': return "0100001";
    223                         case '4': return "0011101";
    224                         case '5': return "0111001";
    225                         case '6': return "0000101";//000101
    226                         case '7': return "0010001";
    227                         case '8': return "0001001";
    228                         case '9': return "0010111";
    229                         default: return "Error!";
    230                     }
    231                 }
    232             case 'C':
    233                 {
    234                     switch (c)
    235                     {
    236                         case '0': return "1110010";
    237                         case '1': return "1100110";
    238                         case '2': return "1101100";
    239                         case '3': return "1000010";
    240                         case '4': return "1011100";
    241                         case '5': return "1001110";
    242                         case '6': return "1010000";
    243                         case '7': return "1000100";
    244                         case '8': return "1001000";
    245                         case '9': return "1110100";
    246                         default: return "Error!";
    247                     }
    248                 }
    249             default: return "Error!";
    250         }
    251     }
    252     private static string ean13type(char c)
    253     {
    254         switch (c)
    255         {
    256             case '0': return "AAAAAA";
    257             case '1': return "AABABB";
    258             case '2': return "AABBAB";
    259             case '3': return "AABBBA";
    260             case '4': return "ABAABB";
    261             case '5': return "ABBAAB";
    262             case '6': return "ABBBAA";//中国
    263             case '7': return "ABABAB";
    264             case '8': return "ABABBA";
    265             case '9': return "ABBABA";
    266             default: return "Error!";
    267         }
    268     }
    269 
    270     #region Code patterns
    271 
    272     // in principle these rows should each have 6 elements
    273     // however, the last one -- STOP -- has 7. The cost of the
    274     // extra integers is trivial, and this lets the code flow
    275     // much more elegantly
    276     private static readonly int[,] cPatterns = 
    277                      {
    278                         {2,1,2,2,2,2,0,0},  // 0
    279                         {2,2,2,1,2,2,0,0},  // 1
    280                         {2,2,2,2,2,1,0,0},  // 2
    281                         {1,2,1,2,2,3,0,0},  // 3
    282                         {1,2,1,3,2,2,0,0},  // 4
    283                         {1,3,1,2,2,2,0,0},  // 5
    284                         {1,2,2,2,1,3,0,0},  // 6
    285                         {1,2,2,3,1,2,0,0},  // 7
    286                         {1,3,2,2,1,2,0,0},  // 8
    287                         {2,2,1,2,1,3,0,0},  // 9
    288                         {2,2,1,3,1,2,0,0},  // 10
    289                         {2,3,1,2,1,2,0,0},  // 11
    290                         {1,1,2,2,3,2,0,0},  // 12
    291                         {1,2,2,1,3,2,0,0},  // 13
    292                         {1,2,2,2,3,1,0,0},  // 14
    293                         {1,1,3,2,2,2,0,0},  // 15
    294                         {1,2,3,1,2,2,0,0},  // 16
    295                         {1,2,3,2,2,1,0,0},  // 17
    296                         {2,2,3,2,1,1,0,0},  // 18
    297                         {2,2,1,1,3,2,0,0},  // 19
    298                         {2,2,1,2,3,1,0,0},  // 20
    299                         {2,1,3,2,1,2,0,0},  // 21
    300                         {2,2,3,1,1,2,0,0},  // 22
    301                         {3,1,2,1,3,1,0,0},  // 23
    302                         {3,1,1,2,2,2,0,0},  // 24
    303                         {3,2,1,1,2,2,0,0},  // 25
    304                         {3,2,1,2,2,1,0,0},  // 26
    305                         {3,1,2,2,1,2,0,0},  // 27
    306                         {3,2,2,1,1,2,0,0},  // 28
    307                         {3,2,2,2,1,1,0,0},  // 29
    308                         {2,1,2,1,2,3,0,0},  // 30
    309                         {2,1,2,3,2,1,0,0},  // 31
    310                         {2,3,2,1,2,1,0,0},  // 32
    311                         {1,1,1,3,2,3,0,0},  // 33
    312                         {1,3,1,1,2,3,0,0},  // 34
    313                         {1,3,1,3,2,1,0,0},  // 35
    314                         {1,1,2,3,1,3,0,0},  // 36
    315                         {1,3,2,1,1,3,0,0},  // 37
    316                         {1,3,2,3,1,1,0,0},  // 38
    317                         {2,1,1,3,1,3,0,0},  // 39
    318                         {2,3,1,1,1,3,0,0},  // 40
    319                         {2,3,1,3,1,1,0,0},  // 41
    320                         {1,1,2,1,3,3,0,0},  // 42
    321                         {1,1,2,3,3,1,0,0},  // 43
    322                         {1,3,2,1,3,1,0,0},  // 44
    323                         {1,1,3,1,2,3,0,0},  // 45
    324                         {1,1,3,3,2,1,0,0},  // 46
    325                         {1,3,3,1,2,1,0,0},  // 47
    326                         {3,1,3,1,2,1,0,0},  // 48
    327                         {2,1,1,3,3,1,0,0},  // 49
    328                         {2,3,1,1,3,1,0,0},  // 50
    329                         {2,1,3,1,1,3,0,0},  // 51
    330                         {2,1,3,3,1,1,0,0},  // 52
    331                         {2,1,3,1,3,1,0,0},  // 53
    332                         {3,1,1,1,2,3,0,0},  // 54
    333                         {3,1,1,3,2,1,0,0},  // 55
    334                         {3,3,1,1,2,1,0,0},  // 56
    335                         {3,1,2,1,1,3,0,0},  // 57
    336                         {3,1,2,3,1,1,0,0},  // 58
    337                         {3,3,2,1,1,1,0,0},  // 59
    338                         {3,1,4,1,1,1,0,0},  // 60
    339                         {2,2,1,4,1,1,0,0},  // 61
    340                         {4,3,1,1,1,1,0,0},  // 62
    341                         {1,1,1,2,2,4,0,0},  // 63
    342                         {1,1,1,4,2,2,0,0},  // 64
    343                         {1,2,1,1,2,4,0,0},  // 65
    344                         {1,2,1,4,2,1,0,0},  // 66
    345                         {1,4,1,1,2,2,0,0},  // 67
    346                         {1,4,1,2,2,1,0,0},  // 68
    347                         {1,1,2,2,1,4,0,0},  // 69
    348                         {1,1,2,4,1,2,0,0},  // 70
    349                         {1,2,2,1,1,4,0,0},  // 71
    350                         {1,2,2,4,1,1,0,0},  // 72
    351                         {1,4,2,1,1,2,0,0},  // 73
    352                         {1,4,2,2,1,1,0,0},  // 74
    353                         {2,4,1,2,1,1,0,0},  // 75
    354                         {2,2,1,1,1,4,0,0},  // 76
    355                         {4,1,3,1,1,1,0,0},  // 77
    356                         {2,4,1,1,1,2,0,0},  // 78
    357                         {1,3,4,1,1,1,0,0},  // 79
    358                         {1,1,1,2,4,2,0,0},  // 80
    359                         {1,2,1,1,4,2,0,0},  // 81
    360                         {1,2,1,2,4,1,0,0},  // 82
    361                         {1,1,4,2,1,2,0,0},  // 83
    362                         {1,2,4,1,1,2,0,0},  // 84
    363                         {1,2,4,2,1,1,0,0},  // 85
    364                         {4,1,1,2,1,2,0,0},  // 86
    365                         {4,2,1,1,1,2,0,0},  // 87
    366                         {4,2,1,2,1,1,0,0},  // 88
    367                         {2,1,2,1,4,1,0,0},  // 89
    368                         {2,1,4,1,2,1,0,0},  // 90
    369                         {4,1,2,1,2,1,0,0},  // 91
    370                         {1,1,1,1,4,3,0,0},  // 92
    371                         {1,1,1,3,4,1,0,0},  // 93
    372                         {1,3,1,1,4,1,0,0},  // 94
    373                         {1,1,4,1,1,3,0,0},  // 95
    374                         {1,1,4,3,1,1,0,0},  // 96
    375                         {4,1,1,1,1,3,0,0},  // 97
    376                         {4,1,1,3,1,1,0,0},  // 98
    377                         {1,1,3,1,4,1,0,0},  // 99
    378                         {1,1,4,1,3,1,0,0},  // 100
    379                         {3,1,1,1,4,1,0,0},  // 101
    380                         {4,1,1,1,3,1,0,0},  // 102
    381                         {2,1,1,4,1,2,0,0},  // 103
    382                         {2,1,1,2,1,4,0,0},  // 104
    383                         {2,1,1,2,3,2,0,0},  // 105
    384                         {2,3,3,1,1,1,2,0}   // 106
    385                      };
    386 
    387     #endregion Code patterns
    388 
    389     #region 128条形码
    390 
    391     private const int cQuietWidth = 10;
    392 
    393     /// <summary>
    394     /// Make an image of a Code128 barcode for a given string
    395     /// </summary>
    396     /// <param name="InputData">Message to be encoded</param>
    397     /// <param name="BarWeight">Base thickness for bar width (1 or 2 works well)</param>
    398     /// <param name="AddQuietZone">Add required horiz margins (use if output is tight)</param>
    399     /// <returns>An Image of the Code128 barcode representing the message</returns>
    400     public static Image MakeBarcodeImage(string InputData, int BarWeight, bool AddQuietZone)
    401     {
    402         // get the Code128 codes to represent the message
    403         Code128Content content = new Code128Content(InputData);
    404         int[] codes = content.Codes;
    405 
    406         int width, height;
    407         width = ((codes.Length - 3) * 11 + 35) * BarWeight;
    408         height = Convert.ToInt32(System.Math.Ceiling(Convert.ToSingle(width) * .15F));
    409 
    410         if (AddQuietZone)
    411         {
    412             width += 20;  // on both sides
    413         }
    414         //draw the codetext bottom
    415         height += 30;
    416         // get surface to draw on
    417         Image myimg = new System.Drawing.Bitmap(width, height);
    418         using (Graphics gr = Graphics.FromImage(myimg))
    419         {
    420 
    421             // set to white so we don't have to fill the spaces with white
    422             gr.FillRectangle(System.Drawing.Brushes.White, 0, 0, width, height);
    423 
    424             // skip quiet zone
    425             int cursor = AddQuietZone ? 10 : 0;
    426 
    427             for (int codeidx = 0; codeidx < codes.Length; codeidx++)
    428             {
    429                 int code = codes[codeidx];
    430 
    431                 // take the bars two at a time: a black and a white
    432                 for (int bar = 0; bar < 8; bar += 2)
    433                 {
    434                     int barwidth = cPatterns[code, bar] * BarWeight;
    435                     int spcwidth = cPatterns[code, bar + 1] * BarWeight;
    436 
    437                     // if width is zero, don't try to draw it
    438                     if (barwidth > 0)
    439                     {
    440                         gr.FillRectangle(System.Drawing.Brushes.Black, cursor, 5, barwidth, height - 20);
    441                     }
    442 
    443                     // note that we never need to draw the space, since we 
    444                     // initialized the graphics to all white
    445 
    446                     // advance cursor beyond this pair
    447                     cursor += (barwidth + spcwidth);
    448                 }
    449             }
    450             gr.DrawString(InputData, new Font("Arial", 9), Brushes.Black, new PointF(10, height - 15));
    451         }
    452         return myimg;
    453 
    454     }
    455 
    456     #endregion
    457 }
    458 
    459 #region Code128Content
    460 
    461 public enum CodeSet
    462 {
    463     CodeA
    464     , CodeB
    465     // ,CodeC   // not supported
    466 }
    467 
    468 /// <summary>
    469 /// Represent the set of code values to be output into barcode form
    470 /// </summary>
    471 public class Code128Content
    472 {
    473     private int[] mCodeList;
    474 
    475     /// <summary>
    476     /// Create content based on a string of ASCII data
    477     /// </summary>
    478     /// <param name="AsciiData">the string that should be represented</param>
    479     public Code128Content(string AsciiData)
    480     {
    481         mCodeList = StringToCode128(AsciiData);
    482     }
    483 
    484     /// <summary>
    485     /// Provides the Code128 code values representing the object's string
    486     /// </summary>
    487     public int[] Codes
    488     {
    489         get
    490         {
    491             return mCodeList;
    492         }
    493     }
    494 
    495     /// <summary>
    496     /// Transform the string into integers representing the Code128 codes
    497     /// necessary to represent it
    498     /// </summary>
    499     /// <param name="AsciiData">String to be encoded</param>
    500     /// <returns>Code128 representation</returns>
    501     private int[] StringToCode128(string AsciiData)
    502     {
    503         // turn the string into ascii byte data
    504         byte[] asciiBytes = Encoding.ASCII.GetBytes(AsciiData);
    505 
    506         // decide which codeset to start with
    507         Code128Code.CodeSetAllowed csa1 = asciiBytes.Length > 0 ? Code128Code.CodesetAllowedForChar(asciiBytes[0]) : Code128Code.CodeSetAllowed.CodeAorB;
    508         Code128Code.CodeSetAllowed csa2 = asciiBytes.Length > 0 ? Code128Code.CodesetAllowedForChar(asciiBytes[1]) : Code128Code.CodeSetAllowed.CodeAorB;
    509         CodeSet currcs = GetBestStartSet(csa1, csa2);
    510 
    511         // set up the beginning of the barcode
    512         System.Collections.ArrayList codes = new System.Collections.ArrayList(asciiBytes.Length + 3); // assume no codeset changes, account for start, checksum, and stop
    513         codes.Add(Code128Code.StartCodeForCodeSet(currcs));
    514 
    515         // add the codes for each character in the string
    516         for (int i = 0; i < asciiBytes.Length; i++)
    517         {
    518             int thischar = asciiBytes[i];
    519             int nextchar = asciiBytes.Length > (i + 1) ? asciiBytes[i + 1] : -1;
    520 
    521             codes.AddRange(Code128Code.CodesForChar(thischar, nextchar, ref currcs));
    522         }
    523 
    524         // calculate the check digit
    525         int checksum = (int)(codes[0]);
    526         for (int i = 1; i < codes.Count; i++)
    527         {
    528             checksum += i * (int)(codes[i]);
    529         }
    530         codes.Add(checksum % 103);
    531 
    532         codes.Add(Code128Code.StopCode());
    533 
    534         int[] result = codes.ToArray(typeof(int)) as int[];
    535         return result;
    536     }
    537 
    538     /// <summary>
    539     /// Determines the best starting code set based on the the first two 
    540     /// characters of the string to be encoded
    541     /// </summary>
    542     /// <param name="csa1">First character of input string</param>
    543     /// <param name="csa2">Second character of input string</param>
    544     /// <returns>The codeset determined to be best to start with</returns>
    545     private CodeSet GetBestStartSet(Code128Code.CodeSetAllowed csa1, Code128Code.CodeSetAllowed csa2)
    546     {
    547         int vote = 0;
    548 
    549         vote += (csa1 == Code128Code.CodeSetAllowed.CodeA) ? 1 : 0;
    550         vote += (csa1 == Code128Code.CodeSetAllowed.CodeB) ? -1 : 0;
    551         vote += (csa2 == Code128Code.CodeSetAllowed.CodeA) ? 1 : 0;
    552         vote += (csa2 == Code128Code.CodeSetAllowed.CodeB) ? -1 : 0;
    553 
    554         return (vote > 0) ? CodeSet.CodeA : CodeSet.CodeB;   // ties go to codeB due to my own prejudices
    555     }
    556 }
    557 
    558 /// <summary>
    559 /// Static tools for determining codes for individual characters in the content
    560 /// </summary>
    561 public static class Code128Code
    562 {
    563     #region Constants
    564 
    565     private const int cSHIFT = 98;
    566     private const int cCODEA = 101;
    567     private const int cCODEB = 100;
    568 
    569     private const int cSTARTA = 103;
    570     private const int cSTARTB = 104;
    571     private const int cSTOP = 106;
    572 
    573     #endregion
    574 
    575     /// <summary>
    576     /// Get the Code128 code value(s) to represent an ASCII character, with 
    577     /// optional look-ahead for length optimization
    578     /// </summary>
    579     /// <param name="CharAscii">The ASCII value of the character to translate</param>
    580     /// <param name="LookAheadAscii">The next character in sequence (or -1 if none)</param>
    581     /// <param name="CurrCodeSet">The current codeset, that the returned codes need to follow;
    582     /// if the returned codes change that, then this value will be changed to reflect it</param>
    583     /// <returns>An array of integers representing the codes that need to be output to produce the 
    584     /// given character</returns>
    585     public static int[] CodesForChar(int CharAscii, int LookAheadAscii, ref CodeSet CurrCodeSet)
    586     {
    587         int[] result;
    588         int shifter = -1;
    589 
    590         if (!CharCompatibleWithCodeset(CharAscii, CurrCodeSet))
    591         {
    592             // if we have a lookahead character AND if the next character is ALSO not compatible
    593             if ((LookAheadAscii != -1) && !CharCompatibleWithCodeset(LookAheadAscii, CurrCodeSet))
    594             {
    595                 // we need to switch code sets
    596                 switch (CurrCodeSet)
    597                 {
    598                     case CodeSet.CodeA:
    599                         shifter = cCODEB;
    600                         CurrCodeSet = CodeSet.CodeB;
    601                         break;
    602                     case CodeSet.CodeB:
    603                         shifter = cCODEA;
    604                         CurrCodeSet = CodeSet.CodeA;
    605                         break;
    606                 }
    607             }
    608             else
    609             {
    610                 // no need to switch code sets, a temporary SHIFT will suffice
    611                 shifter = cSHIFT;
    612             }
    613         }
    614 
    615         if (shifter != -1)
    616         {
    617             result = new int[2];
    618             result[0] = shifter;
    619             result[1] = CodeValueForChar(CharAscii);
    620         }
    621         else
    622         {
    623             result = new int[1];
    624             result[0] = CodeValueForChar(CharAscii);
    625         }
    626 
    627         return result;
    628     }
    629 
    630     /// <summary>
    631     /// Tells us which codesets a given character value is allowed in
    632     /// </summary>
    633     /// <param name="CharAscii">ASCII value of character to look at</param>
    634     /// <returns>Which codeset(s) can be used to represent this character</returns>
    635     public static CodeSetAllowed CodesetAllowedForChar(int CharAscii)
    636     {
    637         if (CharAscii >= 32 && CharAscii <= 95)
    638         {
    639             return CodeSetAllowed.CodeAorB;
    640         }
    641         else
    642         {
    643             return (CharAscii < 32) ? CodeSetAllowed.CodeA : CodeSetAllowed.CodeB;
    644         }
    645     }
    646 
    647     /// <summary>
    648     /// Determine if a character can be represented in a given codeset
    649     /// </summary>
    650     /// <param name="CharAscii">character to check for</param>
    651     /// <param name="currcs">codeset context to test</param>
    652     /// <returns>true if the codeset contains a representation for the ASCII character</returns>
    653     public static bool CharCompatibleWithCodeset(int CharAscii, CodeSet currcs)
    654     {
    655         CodeSetAllowed csa = CodesetAllowedForChar(CharAscii);
    656         return csa == CodeSetAllowed.CodeAorB
    657                  || (csa == CodeSetAllowed.CodeA && currcs == CodeSet.CodeA)
    658                  || (csa == CodeSetAllowed.CodeB && currcs == CodeSet.CodeB);
    659     }
    660 
    661     /// <summary>
    662     /// Gets the integer code128 code value for a character (assuming the appropriate code set)
    663     /// </summary>
    664     /// <param name="CharAscii">character to convert</param>
    665     /// <returns>code128 symbol value for the character</returns>
    666     public static int CodeValueForChar(int CharAscii)
    667     {
    668         return (CharAscii >= 32) ? CharAscii - 32 : CharAscii + 64;
    669     }
    670 
    671     /// <summary>
    672     /// Return the appropriate START code depending on the codeset we want to be in
    673     /// </summary>
    674     /// <param name="cs">The codeset you want to start in</param>
    675     /// <returns>The code128 code to start a barcode in that codeset</returns>
    676     public static int StartCodeForCodeSet(CodeSet cs)
    677     {
    678         return cs == CodeSet.CodeA ? cSTARTA : cSTARTB;
    679     }
    680 
    681     /// <summary>
    682     /// Return the Code128 stop code
    683     /// </summary>
    684     /// <returns>the stop code</returns>
    685     public static int StopCode()
    686     {
    687         return cSTOP;
    688     }
    689 
    690     /// <summary>
    691     /// Indicates which code sets can represent a character -- CodeA, CodeB, or either
    692     /// </summary>
    693     public enum CodeSetAllowed
    694     {
    695         CodeA,
    696         CodeB,
    697         CodeAorB
    698     }
    699 
    700 }
    701 #endregion
    View Code
  • 相关阅读:
    开始核心攻坚
    Features postponed for ASP.NET 2.0 Beta 2
    设计模式的认识
    如果您想要提高开发效率,那么给大家推荐一本书,比较实用
    asp.net 2.0 个性化服务探讨
    对于数据缓存依赖的认识
    ASP.NET 2.0学习(1)——XmlDataSource控件中XPath属性之疑惑
    写作的四个境界
    ASP.NET 2.0 product design changes between Beta 1 and Beta 2(a new message from asp.net forum)
    验证控件的问题
  • 原文地址:https://www.cnblogs.com/herf/p/6182391.html
Copyright © 2020-2023  润新知