使用Font()很容易生成3 of 9条形码。

Font f = new Font("Free 3 of 9", 80);
this.Font = f;

Label l = new Label();
l.Text = "*STACKOVERFLOW*";
l.Size = new System.Drawing.Size(800, 600);
this.Controls.Add(l);

this.Size = new Size(800, 600);

它的工作。我看到了条形码,我能扫描它。现在我想使用一些其他的东西,比如Code 128,我需要安装字体(完成),然后改变
Font f = new Font("Free 3 of 9", 80);Font f = new Font("Code 128", 80);
在那之后,我在窗户上看到一个条形码。问题是我无法扫描。我想那是因为我没有用正确的开始和停止标签来标记条形码。据我所知,必须始终有一个开始/停止字符或其他。对于代码128,9中的3是*我不确定。在wiki上有开始代码a,所以我尝试了
Font f = new Font("<Start Code A>test<Stop>", 80);Font f = new Font("<Start Code A>test<Stop Code A>", 80);等等…我无法扫描输出。因为扫描器找不到开始和停止字符。有什么想法吗?谢谢你

最佳答案

代码128可以用完全正确的字体表示。不过,它比9的3要复杂,因为必须在末尾包含一个校验和字符,该字符需要根据条形码的内容动态计算。还有3个不同的版本,每个版本都有不同的起始字符。
换言之,条形码的布局应如下所示:

[start char][barcode][checksum][stop char]

code128的好处是它比9的3简洁得多。
This page帮助我计算校验和的算法。
算法的一个非常一般的概述是:
条码的每个字符都有一个指定的值
取决于角色是什么以及它在
条形码。
以上1)中的所有值相加。
得到上面2)中的总模量103值。
在大多数情况下,校验和字符将是(模值)的ascii码。
加上上述3)中确定的32)。
有一些细微差别,我最终需要用javascript创建这个算法(没有问题)。为了供我以后参考和显示一些细微差别,这就是它的样子:
/*
 * This is the variable part of my barcode, I append this to a
 * static prefix later, but I need to perform logic to compute the
 * checksum for this variable. There is logic earlier that enforces
 * this variable as a 9 character string containing only digits.
 */
var formIncrement = // a 9 char "digit" string variable

/*
 * Dynamically compute the total checksum value (before modulus)
 * for the variable part of my barcode, I will need to get a modulus
 * from this total when I am done. If you need a variable number of
 * characters in your barcodes or if they are not all digits
 * obviously something different would have to be done here.
 */
var incrementCS = ((parseInt(formIncrement.charAt(0)) + 16) * 7) +
                  ((parseInt(formIncrement.charAt(1)) + 16) * 8) +
                  ((parseInt(formIncrement.charAt(2)) + 16) * 9) +
                  ((parseInt(formIncrement.charAt(3)) + 16) * 10) +
                  ((parseInt(formIncrement.charAt(4)) + 16) * 11) +
                  ((parseInt(formIncrement.charAt(5)) + 16) * 12) +
                  ((parseInt(formIncrement.charAt(6)) + 16) * 13) +
                  ((parseInt(formIncrement.charAt(7)) + 16) * 14) +
                  ((parseInt(formIncrement.charAt(8)) + 16) * 15);

/*
 * 452 is the total checksum for my barcodes static prefix (600001),
 * so it doesn't need to be computed dynamically, I just add it to
 * the variable checksum total determined above and then get the
 * modulus of that sum:
 */
var checksum = (452 + incrementCS) % 103


var barcode = "š600001" + formIncrement

/*
 * The 0 and the 95 - 102 cases had to be defined explicitly because
 * their checksum figures do not line up with the javascript char
 * codes for some reason (see the code 128 definition table in the
 * linked page) otherwise we simply need to get the charCode of the
 * checksum + 32. I also tack on the stop char here.
 */
switch (checksum) {
    case 0 :
    barcode += "€œ";
    break;
    case 95 :
    barcode += "‘œ";
    break;
    case 96 :
    barcode += "’œ";
    break;
    case 97 :
    barcode += "“œ";
    break;
    case 98 :
    barcode += "”œ";
    break;
    case 99 :
    barcode += "•œ";
    break;
    case 100 :
    barcode += "–œ";
    break;
    case 101 :
    barcode += "—œ";
    break;
    case 102 :
    barcode += "˜œ";
    break;
    default :
    barcode += String.fromCharCode(checksum + 32) + "œ";
}

return barcode;

您可能会注意到,我的示例(_,_)中的start和stop字符似乎与链接页上显示的字符不匹配。如果我记得的话,我想是因为我有一些非标准的code128字体,这些字符被翻译成了正确的。
编辑
我查了一下我的文件。我好像是从right here得到字体的。使用这种字体并使用上面的算法,我刚刚为test制作了一个代码128b的条形码,结果显示štestwœ,它扫描得很好。您的校验和算法似乎工作正常,因为我们都有w,但如果您得到:ÌtestwÎ,则您的开始和停止代码看起来是关闭的。
我特意寻找我正在使用的相同条形码字体,因为我感觉不同品牌的code128字体可能实现不同的字符来表示开始和结束条形码。

关于c# - 我的条形码出了问题(代码128),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10977068/

10-13 00:55