这个计算Code128条码校验位的代码正确吗?

2024-04-25

根据我对 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“幻数”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;
}

UPDATE

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

那么数学(假设 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)“-”?

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

UPDATE 2

我承认我不完全是条形码的观察者,所以我可能已经看到了这样的东西,只是没有注意到/注意,但是can条形码有“-”和“等校验位”“?这看起来很奇怪;我希望它们始终是字母数字,如果不仅仅是数字。如果我的怀疑是正确的,当计算最终以“-”或“等松散的校验数字结束时,会做什么?”或“~”,等等?

UPDATE 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”,包括开始128B(104),停止(106)和校验和79 (1109 % 103)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这个计算Code128条码校验位的代码正确吗? 的相关文章

随机推荐

  • DRY:如何在 Symfony2 项目的多个实体中使用此代码?特质?

    我有一段重复的代码 将在我的 Symfony2 项目中的多个实体中使用 因此应用某种 DRY 就可以了 当然如果可能的话 我正在考虑PHP 特性 http php net manual en language oop5 traits php
  • 如何在M1 arm64架构上安装PyQt5?

    我有一台 M1 mac 但我注意到 每当本机 python 运行任何自动化脚本 如 PyAutoGui 时 它都会逐渐变得越来越慢 几乎就像受到了限制一样 我用 Miniforge3 创建了一个能够利用 Apple 芯片的环境 使脚本运行得
  • 如何制作进度条

    如何在 html css javascript 中制作进度条 我真的不想使用Flash 可以在这里找到类似的内容 http dustincurtis com about html http dustincurtis com about ht
  • 缩放 ImageView 的图像,同时将中心点保持在同一位置

    我已将预缩放位图设置为 ImageView 的源 然后我读了矩阵ImageView并通过以下方式移动 ImageView 的位图matrix postTranslate shiftX shiftY 现在我想放大 缩小图像 同时保持中心Ima
  • Android Volley POST Json 到服务器

    我正在使用 Volley 在 Android 设备和网络服务器之间传输数据 我发现有关将数据列表发送到服务器的问题 例如 我的类将生成如下数据集 1 1 aID 5 2 aID 5 3 aID 5 4 aID 5 2 1 bID 3 2 b
  • ArrayLists 比数组慢 2 倍

    我正在测试一种分子动力学算法 该算法除其他外 还有一个 Particle 类 由9 双精度数组存储粒子分量 3D 环境中的速度 力和位置 我使用 5 个输入大小测试算法 Size MB Time s 0 06 0 36 fits in ca
  • 将浏览器配置文件传递给 docker 容器内的 selenium 的正确方法是什么?

    我需要启动selenium inside docker容器 将浏览器配置文件传递给很重要webdriver Here s docker compose version 2 services worker main build app vol
  • facebook-android-sdk 错误:发布共享对话框需要publish_actions

    我需要对我的应用程序进行publish actions才能在用户墙中发布 但它被拒绝了 因为 据说 Facebook不需要publish actions 但我尝试使用共享对话框通过以下代码共享图片 SharePhoto photo new
  • Apache Spark 中的线性回归给出错误的截距和权重

    对 y 2 x1 3 x2 4 的虚拟数据集 y x1 x2 使用 MLLib LinearRegressionWithSGD 会产生错误的截距和权重 实际使用的数据是 x1 x2 y 1 0 1 6 3 2 0 2 8 6 3 0 3 1
  • 通过 Phonegap 连接到 HTTP 服务器

    我有一个服务器组件 它通过 HTTP 连接到远程服务器并获得一些响应 如果我使用 Android 版 Phonegap 我可以连接到 java 插件中的此类服务器端代码吗 您可以使用 javascript 的 xmlHttpRequest
  • 如何在 C# 中异步读取结束进程输出?

    我在 C 中异步读取一个进程的输出时遇到问题 我在这个网站上发现了一些其他类似的问题 但它们并没有真正帮助我 这是我所做的 制定新流程 设置启动信息 文件名 参数 CreateNoWindow true UseShellExecute fa
  • Spark 中的默认分区方案

    当我执行以下命令时 scala gt val rdd sc parallelize List 1 2 3 4 3 6 4 partitionBy new HashPartitioner 10 persist rdd org apache s
  • 如何在 SQL Server 中使用 RANK()

    我使用时遇到问题RANK https msdn microsoft com en us library ms176102 aspx在 SQL Server 中 这是我的代码 SELECT contendernum totals RANK O
  • 使用 Json.format 没有可用的 MyClass 隐式格式

    在 Json format 上使用复杂对象作为另一个对象的属性时出现错误 我有两节课 RoleDTO and 电子邮件邀请DTO 电子邮件邀请DTO has a RoleDTO 所以 我宣布 case class RoleDTO id Op
  • Java正则表达式匹配除

    匹配除特定字符之外的所有字符的正确语法是什么 例如我想匹配除字母之外的所有内容 A Z a z 和数字 0 9 I have string matches A Z a z 0 9 这是不正确的吗 是的 你不需要嵌套 像那样 使用这个代替 A
  • 根据情况启动docker容器

    Problem 我有一个包含 6 个服务的 docker compose yml 当我执行 docker compose up 时 所有 6 个容器都会启动 但我需要 2 个容器来最初开始工作 并根据条件休息 4 个容器 描述 组合中的 6
  • OpenCL 矩阵乘法应该更快?

    我正在尝试学习如何使 GPU 优化 OpenCL 内核 我以使用本地内存中的方形图块进行矩阵乘法为例 然而在最好的情况下 我只得到了约 10 倍的加速 约 50 Gflops 与 numpy dot 相比 5 Gflops 它使用的是 BL
  • 如何使这两个事件的代码简短

    我有以下代码 我怎样才能使它简短 以便它可以通过单击并输入来工作 这样我就不必重复它 document ready function document keypress function e if e which 13 form myfor
  • 如何将存储值分配给隐藏字段

    我有一个模型和商店 我需要为商店中的隐藏字段分配一个值 Ext define loginUser extend Ext data Model fields name id mapping Provider id name name mapp
  • 这个计算Code128条码校验位的代码正确吗?

    根据我对 Code128 条形码 与大多数其他标准条形码类型截然不同 的校验位计算的理解 我下面的代码是正确的 然而 我希望那些可能更了解 有一些经验观察 来自附着在风衣 或实验室 外套上的战壕泥的人进行 健全性检查 这是我的理解 条形码中