gpt4 book ai didi

c# - 这个计算 Code128 条码校验位的代码是否正确?

转载 作者:行者123 更新时间:2023-11-30 16:16:08 29 4
gpt4 key购买 nike

根据我对 Code128 条码校验位计算的理解*(与大多数其他标准条码类型完全不同/完全不同),我下面的代码是正确的。但是,我很感激那些可能更了解/有一些经验观察/从附着在他们的战壕(或实验室)外套上的战壕中的泥土的人进行的“健全性检查”。

  • 这是我的理解:

  • 条形码中的每个字符,从左边开始,首先被转换成它的 ASCII 码(IOW,条形码字符“1”被视为它的 ASCII 码 49,等等),然后该值乘以其序数在字符数组中的位置。

    例如对于制造的条形码编号“123456789”,“1”相当于 49,“2”相当于 50,……“9”相当于 57。

    然后,每个字符的序号位置乘以其 ASCII 值。例如,1*49 == 49、2*50==100、... 9*57==513。
    然后将所有这些相加,得出(在本例中)2,445。

    下一步是将该数字除以 Code128“魔数(Magic Number)”103;您感兴趣的值是模数。因此,在这种情况下,2445 % 103 == 76。

    倒数第二 - 最后,您转换该值 (76),将其视为 ASCII 代码,将另一个方向返回到其“表示”值,即“L”。

    最后,您将计算出的字符附加到原始条形码。确实如此(尽管有更多的麻烦或告别),您最终得到的值为“123456789L”

    如果这不是正确的值,那么我理解错误。

    以下是一些条形码:
    0) 123456789
    1) 12345678
    2) 1234567
    3) 123456

    ...以及它们应该如何与计算出的校验位一起出现(并使用下面的代码):
    0) 123456789L
    1) 12345678N
    2) 1234567*
    3) 123456E

    最后但并非最不重要的是,这是我用来计算 Code128 校验位的代码:
    private void buttonAppendCode128CheckDigit_Click(object sender, EventArgs e)
    {
    const int CODE_128_DIVISOR = 103;
    string barCode = textBoxRawCode128.Text.Trim();
    int runningTotal = 0;

    for (int i = barCode.Length - 1; i > -1; i--)
    {
    char valToConvertToASCII = Convert.ToChar(barCode[i]);
    int valToMultiply = ConvertToASCIIInt(valToConvertToASCII);
    runningTotal += (valToMultiply*(i + 1));
    }

    int code128Modulus = runningTotal%CODE_128_DIVISOR;
    textBoxCode128WithCheckDigit.Text = barCode + ConvertToASCIIChar(code128Modulus);
    }

    private char ConvertToASCIIChar(int code128Modulus)
    {
    return (char) code128Modulus;
    }

    private int ConvertToASCIIInt(char valToConvertToASCII)
    {
    return valToConvertToASCII;
    }

    更新

    我不太理解布赖恩·安德森的回答;他可能是对的(可能是),但我认为就校验位计算而言,起始位和停止位将被忽略。难道它们不只是为了让条码扫描器知道从哪个点开始注意,然后从哪个点恢复它的电子贪睡?

    然后数学(假设 Brian 需要从 ASCII 值中减去 32 是正确的)将是:
    (17*1)+(18*2)+(19*3)+(20*4)+(21*5)+(22*6)+(23*7)+(24*8)+(25*9)
    -or:
    17 + 36 + 57 + 80 + 105 + 132 + 161 + 192 + 225 == 1005

    为什么开始字符会包含在计算中,而不是停止字符?

    由于 1005 % 103 == 78,校验位将是……“N”……还是 (78-​​32 == 46) “-”?

    如果同时包含停止和开始字符,那么当然也会改变解决方案......

    更新 2

    我承认我不完全是条码的观察者,所以我可能见过这样的,只是没有注意到/注意,但是条码可以有像“-”和“”这样的校验位吗?这似乎很奇怪;如果不仅仅是数字,我希望它们始终是字母数字。如果我的怀疑是正确的,那么当计算确实以“-”或“”或“~”等松散的校验位结束时,会怎么做,&c?

    更新 3

    因此,如果我理解了 Brian 和我正确阅读的其他来源,我将从条形码扫描仪读取语义解码为:
    [startChar]123456789[checkDigit][stopChar]

    ...但是这会在逻辑上去掉停止字符——因为它不是校验位计算的一部分——并且(不那么合乎逻辑)也去掉校验位,所以我实际得到的是:
    [startChar]123456789

    ...并对其进行按摩并计算校验位以显示条形码的人类可读表示:
    123456789[checkDigit]

    并且由于如果条形码已扫描,显然已经看到了起始字符(?),我可以将它预先添加到要计算的 runningTotal 值中;因此,我的代码现在是:
    private void buttonAppendCode128CheckDigit_Click(object sender, EventArgs e)
    {
    const int CODE_128_DIVISOR = 103;
    string barCode = textBoxRawCode128.Text.Trim();
    int runningTotal = ConvertToASCIIInt(barcode[0]); // Start with the value of the start char; this should always be either 103 (Code128A), 104 (Code128B), or 105 (Code128C); 106 is the stop char

    for (int i = barCode.Length - 1; i > 0; i--) // now disregarding already calculated first element by ignoring element 0
    {
    char valToConvertToASCII = Convert.ToChar(barCode[i]);
    int valToMultiply = ConvertToASCIIInt(valToConvertToASCII);
    runningTotal += (valToMultiply*(i + 1));
    }

    int code128Modulus = runningTotal%CODE_128_DIVISOR;
    textBoxCode128WithCheckDigit.Text = barCode + ConvertToASCIIChar(code128Modulus);
    }

    private char ConvertToASCIIChar(int code128Modulus)
    {
    return (char) code128Modulus;
    }

    private int ConvertToASCIIInt(char valToConvertToASCII)
    {
    const int ASCII_ADJUSTMENT_VAL = 32;
    return valToConvertToASCII-ASCII_ADJUSTMENT_VAL;
    }

    最佳答案

    看起来您可能缺少代码 128A (103)、128B (104) 或 128C (105) 的起始字符。这个数字用“*1”加权,就像条形码字符串中的第一个字符一样。我还认为您必须使用 Code 128 值(即 ASCII_value_of_character - 32)进行数学计算。所以对于字符串 "123456789"我得到 "104, 17, 18, 19, 20, 21, 22, 23, 24, 25, 79, 106", 包括 Start 128B (104), Stop (106) 和 Checksum 79 (1109 % 103)。

    关于c# - 这个计算 Code128 条码校验位的代码是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18728719/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com