Как преобразовать символ ASCII, например STX, в BitArray, используя C#? - PullRequest
0 голосов
/ 21 апреля 2020

Я новичок в C#. В проекте я имею дело с последовательной связью, где я пытаюсь отправить / получить контрольную сумму для проверки целостности передачи данных. Устройство, на которое я отправляю сообщения, принимает символы и символы ascii, например, пример сообщения может выглядеть следующим образом:

String [STX, 1, X, 5, ETX]

Для расчета контрольная сумма мне нужно сначала преобразовать каждый символ в BitArray. Например,

STX -> [0,1,0,0,0,0,0,0]

1 -> [1,0,0,0,1,1 , 0,0]

et c .. и выполнить некоторые математические операции. И, конечно же, мне также нужно go другим способом, например:

[0,1,0,0,0,0,0,0] -> STX

Я в порядке с этим для одного символа, используя:

byte[] res = System.Text.ASCIIEncoding.ASCII.GetBytes("X");
BitArray bit_arr = new BitArray(res);

Но если я попробую это на многосимвольном символе ascii, таком как STX или SYN, я получу три байтовых массива (по одному для каждого символа) , В настоящее время я использую словарь для go от символа ASCII до Unicode, который работает нормально, но так как я не знаю контрольной суммы заранее, мне в конечном итоге придется поместить все возможные многосимвольные символы ASCII в этот словарь. Есть ли способ получить желаемый результат в C#? Чтобы быть кристально чистым, я хочу:

SomeFunc(STX) = [0,1,0,0,0,0,0,0]

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 22 апреля 2020

Устройство ... принимает символы и символы ascii ...

ASCII обычно относится к набору кодов (то есть числовых значений c) для представления символов и символов.
Печатным / отображаемым символам (таким как прописные и строчные буквы алфавита Engli sh, знаки пунктуации и десятичные цифры) и управляющим кодам присваиваются уникальные значения.
Основа c набор кодов ASCII в диапазоне значений от нуля до 127, поэтому каждый код представлен в 7 битах.

ASCII был наиболее широко используемым базовым c кодовым набором для представления текста в компьютерных системах.
Языки программирования обычно генерируют текстовые строки с использованием кодового набора ASCII.

Выражение " ASCII-символ ... " обычно используется для описания или ссылки на значение цифры 1099 * для этого символа (то есть его кодовое значение ASCII), а не на некоторые символ или глиф.
IOW " ASCII-символ " по сути является сокращением для " ASCII-кода для символа ... ".

Приведенная выше строка должна интерпретироваться как означающая, что устройство использует коды ASCII.


Чтобы вычислить контрольную сумму, мне нужно сначала преобразовать каждый символ в BitArray.

ASCII - это не набор "символов и символов" .
ASCII - это набор чисел. Каждое число представляет (то есть сопоставлено) символ или символ. Такой набор чисел называется набором кодов.
ASCII является набором кодов.

Каждый код ASCII может быть представлен в 7 битах или меньше байта (то есть в восьми битах).
Поскольку каждый ASCII-код обычно хранится в байте, единицы измерения byte и character часто используются взаимозаменяемо, особенно когда речь идет о хранении текста.

Каждый символ в цифровом компьютере представлен числом, например, его кодом ASCII.
Идея, что этот символ на самом деле является "символом" , и его необходимо преобразовать в некоторый Неверный вид цифры c.
Цифровой компьютер может обрабатывать только числа. Если вы хотите представить символ (например, для текста), вы должны закодировать этот символ как число.


Но если я попробую это сделать на многосимвольном символе ascii, таком как STX или SYN ...

Подмножество кодов ASCII представляет непечатаемые символы, которые называются кодами управления.
Большинство функций этих кодов управления относятся к электромеханическим телетайпам, и бумажные удары и читатели. Некоторые из управляющих кодов были переназначены для терминала на основе ЭЛТ, или VDT.

Поскольку управляющие коды ASCII не могут быть напечатаны / отображаемы, нет необходимости представлять их как новый символ или глиф шириной в один столбец.
Следовательно, управляющие коды ASCII представлены двумя - или трехбуквенное имя, такое как STX или CR.

Несколько текстов управления часто используются в текстовых строках, таких как перевод строки, возврат каретки и табуляция. Эти управляющие коды предоставляются для печати (даже если они на самом деле не печатаются) при указании текстовых строк в некоторых языках программирования (таких как C escape-последовательности , например \n, \r, \t ).
В противном случае другие управляющие коды должны быть определены их кодом ASCII в виде числовой c escape-последовательности (например, \x02 для STX).

IOW STX или SYN не являются «многосимвольный символ ascii» .
Не существует такого понятия, как «многосимвольный символ ascii» .


Пока Я использую словарь для go из символа ASCII в Unicode

Есть ли способ получить желаемые результаты в C#?

Каждый символ / символ уже представлен числом, хранящимся в байте.
Нет необходимости в "словаре" или преобразовании из "символа" .

Вы можете продемонстрировать это себе, написав простую программу.
Присвойте текстовую строку массиву байтов.
Распечатайте массив байтов в виде текстовой строки.
Распечатайте массив байтов, но каждый байт в десятичном представлении.
Распечатывает массив байтов, но каждый байт в двоичном представлении.
Распечатывает массив байтов, но каждый байт в шестнадцатеричном представлении.


Таким образом, контрольная сумма может / должна быть рассчитана из символов / байтов сообщения (без перевода в словаре).

...