为啥我的 ASCII char 到 int 转换失败?

Posted

技术标签:

【中文标题】为啥我的 ASCII char 到 int 转换失败?【英文标题】:Why is my ASCII char to int conversion failing?为什么我的 ASCII char 到 int 转换失败? 【发布时间】:2013-09-15 22:35:32 【问题描述】:

根据这里的图表:

http://www.idautomation.com/barcode-faq/code-128/

这个角色:

Ë

等于值 103。

然而这段代码:

string barcode = textBoxRawCode128.Text.Trim(); 
. . .
int runningTotal = ConvertToASCIIInt(barCode[0]);
. . .

private int ConvertToASCIIInt(char valToConvertToASCII)

    const int ASCII_ADJUSTMENT_VAL = 32;
    return valToConvertToASCII - ASCII_ADJUSTMENT_VAL;

...当文本框中的值为“ËTry another string.”时,即barcode[0]为“Ë”,返回值171而不是103...???

而根据这张图:http://www.adams1.com/128table.html,103对应的值是‡,但是当我将barCode设置为“‡Try another string.”时,返回值是8193...???越来越好奇了……

注意:相关/初步帖子是Is this code for calculating Code128 barcode check digits correct?

【问题讨论】:

您引用了 ËUSS Code-128 字符集 值(您的链接)。但是 .NET 不使用 USS Code-128 字符集,而是使用 Unicode。在 Unicode 中,代码点是十六进制的 00CB,请参见同一张表或官方的 Unicode chart。您可能需要一个在 Unicode 和 USS Code-128 字符集之间进行转换的工具。 IOW,这就像一个俄罗斯娃娃,或者一个恶性漩涡。奇怪/难怪有人还没有用像 GetCheckDigit(barcodeType typ, stringbarcodeVal) 这样的方法解决这个挑战——在这种情况下,“typ”是 BarcodeType.Code128 左右。 “奇怪”是因为它不可能那么罕见,需要计算,而“难怪”是因为这对驴子来说太痛苦了。 您链接的页面也有一个.NET Font Encoder。 我想要一个 .NET 字体编码器有什么原因吗? 好问题。当我写那条评论时,我的印象是该链接中的 DLL 还提供了 .NET 方法来调用 ASCII 和这种 Code128 格式之间的转换。但是我没试过,可能我的印象有误。 【参考方案1】:

实际上你显示的字符的值是Ë = 203。小g是ascii值为103的字符。

因此203 - 32 = 171

Reference

【讨论】:

是的,我也测试了“g”;这给了我 71,因为 103-32==71。我从校验位计算中得到的结果是“gTry another string”。附加了一个不可打印的(晦涩的,不是淫秽的)字符。 奇怪的是“g”会是一个起始字符;毕竟,如果有人想将“go west young man”这个值编码为 Code128 条码怎么办?解析器会将“g”视为起始字符,并将其值视为“o west young man”……不是吗? 不确定您要达到的目标。我通常像这样将 char 转换为 ascii int 。 int value = (int)ch。应该够了。我错过了什么吗? ascii 和条形码之间的差是 32,因此是减法。在 THIS ascii chart ;) 看到 Ë 字符是 ascii 211,它在条形码的 128 之外,这将使它无法打印。【参考方案2】:

请记住,要找到 Code 128 符号的正确数字,您必须减去 32,因此要获得 Code 128 符号 103 的 ASCII 值,您必须加上 32,得到 135,这不是7 位 ASCII。 Adams 说得对,但是由于它是“高 ASCII”,因此您会陷入混乱的代码页。因此,根据 PC 的语言以及接触字符串的应用程序是否使用 DBCS 或 Unicode 或 8 位 ASCII,您可能会发现不同的字符,因为国际标准不同。如果您在 Windows Character Map 应用程序中调出 Small Fonts 字体,就可以找到 Russ Adams 给出的字符。查看“0x87”下的字符,十进制为135。

IDAutomation 人员正在使用他们自己的算法根据您输入的字母得出条形码字符,因此如果他们说需要“Ë”才能获得 103,那么这就是他们所需要的。 'Ë' 不等于 103,这只是让他们的软件咳出 103 的原因。这一切都是为了解决从数字 7 位标准到供应商生产酒吧的方法的转换。

遗憾的是,不同的符号体系不使用相同的算法来编码数据或导出校验和,因此每种条形码类型都必须有自己的软件。

【讨论】:

全是紫牛,一团糟!

以上是关于为啥我的 ASCII char 到 int 转换失败?的主要内容,如果未能解决你的问题,请参考以下文章

将 2 个 ASCII char 值转换为 short int

C语言中 怎样把一个int转换成char

为啥将“0”添加到 int 数字允许转换为 char?

为啥 atoi 函数不能将 const char * 转换为 int?

在 Int 中快速转换 Char

初始化矢量 使用int值