2013-09-11 1 views
0

Согласно графику здесь:Почему мой символ ASCII для преобразования int не работает?

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; 
} 

.. .когда значение в текстовом поле и, следовательно, barcode - «Перебирать другую строку», таким образом, где штрих-код [0] равен «Ë», возвращает значение 171 вместо 103 ... ???

И согласно этой диаграмме: http://www.adams1.com/128table.html, значение, соответствующее 103, равно ‡, но когда я устанавливаю barCode на «‡ Попробовать другую строку», возвращаемое значение равно 8193 ... ??? Страньше и страньше ...

Примечание: Связанная/предварительный пост Is this code for calculating Code128 barcode check digits correct?

+1

Вы указываете значение * USS Code-128 Character Set * для 'Ë' (ваша ссылка). Но .NET не использует * USS Code-128 Character Set *, вместо этого он использует Unicode. В Юникоде кодовая точка является шестнадцатеричной «00CB», см. Ту же таблицу или официальную [Юникод-диаграмму] (http://www.unicode.org/charts/PDF/U0080.pdf). Вам может понадобиться инструмент, который конвертирует между Unicode и * USS Code-128 Character Set *. –

+0

IOW, это как русская кукла или порочный вихрь. Нечетно/неудивительно, что кто-то еще не решил эту задачу с помощью метода GetCheckDigit (barcodeType typ, string barcodeVal) - где «typ» в этом случае будет BarcodeType.Code128 или около того. «Нечетный», потому что он не может быть таким редким, что его нужно вычислить, и «неудивительно», потому что это такая боль в ослике. –

+0

Связанная с вами страница также имеет [.NET Font Encoder] (http://www.idautomation.com/font-encoders/dotnet-assembly/). –

ответ

1

Имейте в виду, что, чтобы найти правильный номер для символа Code 128, вы должны вычесть 32, поэтому, чтобы получить значение ASCII символа 103 Code 128, вам придется добавить 32, давая вам 135, который не является 7-разрядным ASCII. Адамс прав, но поскольку это «высокий ASCII», вы попадаете в беспорядок кодовых страниц. Таким образом, в зависимости от языка ПК, и если приложения, которые касаются строки, используют DBCS или Unicode или 8-разрядный ASCII, вы можете найти разные символы, потому что международные стандарты отличаются. Персонаж, предоставленный Russ Adams, может быть найден, если вы вызываете шрифт Small Fonts typefont в приложении «Карта символов Windows». Посмотрите на символ под «0x87», который равен 135 десятичным.

Люди IDAutomation используют свой собственный алгоритм для получения символа штрих-кода на основе букв, которые вы его кормите, поэтому, если они говорят, что им нужен «Ë», чтобы получить 103, то это то, что им нужно. «Ë» не приравнивается к 103, это просто то, что заставляет их программное обеспечение кашлять 103. Это все, чтобы обойти преобразование из числового 7-битного стандарта в метод поставщика для создания баров.

К сожалению, разные символы не используют одни и те же алгоритмы для кодирования данных или получения контрольных сумм, поэтому каждый тип штрих-кода должен иметь свое собственное программное обеспечение.

+1

Полностью пурпурная корова, какой беспорядок! –

4

На самом деле символ, который вы показали, имеет значение Ë = 203. Маленький g - символ, который имеет значение ascii 103.

Отсюда 203 - 32 = 171.

Reference

+0

Да, я тоже тестировал «г»; что дает мне 71, начиная с 103-32 == 71. Результат, который я получаю от вычисления контрольной цифры, - «gTry другая строка». с добавлением непечатаемого (неясного, не непристойного) характера. –

+0

Странно, что «g» будет начальным символом; в конце концов, что, если кто-то хочет кодировать значение «идти западным молодым человеком» в штрих-код Code128? Парсер будет рассматривать «g» как начальный символ и считать ценность «западным молодым человеком» ... не так ли? –

+0

Не знаете, чего вы пытаетесь достичь. Обычно я конвертирую char в ascii int. 'int value = (int) ch'. Должно быть достаточно. У меня что-то не хватает? –

Смежные вопросы