Gilcecler Carneiro Ответов: 1

Преобразуйте этот список в массив байтов


Всем привет
Мне нужно преобразовать этот список в массив байтов для отправки через последовательный порт. Но когда я пытаюсь использовать DataList.SelecMany команда I возвращает ошибку: "Enumerable.SelectMany ..." не может быть выведен на основе использования. Попробуйте явно указать аргументы типа".
что я забыл?

Что я уже пробовал:

List<string> listaDados = new List<string>();
        //
        int szCmds, wdCnt;
        String stValue;

        MessageBox.Show("Print Cheque ");

        int szCmds, wdCnt;

        String stValue;


        stValue = "748";      //Banco
        listaDados.Add("0x1B");
        listaDados.Add("0xA2");
        listaDados.Add(stValue);

        byte[] data = listaDados.SelectMany(BitConverter.GetBytes).ToArray();

        serialPort.Write(data, 0, data.Length);

Richard MacCutchan

Почему бы не использовать StringBuilder вместо списка? Кроме того, строки "0x1B" и "0xA2" не будут преобразовываться в свои байтовые значения, как вы ожидаете, вам нужно использовать соответствующие escape-последовательности "\x1B" и "\xA2".

Gilcecler Carneiro

Ну, пример, который я взял, использовал список

"https://www.codeproject.com/Questions/1130049/How-to-write-serial-port-using-Csharp"

Maciej Los

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

Richard MacCutchan

Это не значит, что она правильная.

Gilcecler Carneiro

об Escape-последовательностях меня например оригинал был на Java.
Я исправлюсь

Gilcecler Carneiro

принял предложение ;)

CPallini

Почему вы используете список строк? Такие строки представляют собой шестнадцатеричное представление байтов. Почему бы вам не использовать непосредственно числа (возможно, шестнадцатеричные ilterals)?
Видеть
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/integral-numeric-types

1 Ответов

Рейтинг:
11

Maciej Los

Предполагая, что у вас есть list<string> и вы хотите преобразовать всю строку в списке в массив байтов...

List<string> listaDados = new List<string>();
listaDados.Add("0x1B");
listaDados.Add("0xA2");
listaDados.Add("748");

Encoding  u8 = Encoding.UTF8;
byte[] result = listaDados.SelectMany(x => u8.GetBytes(x)).ToArray();


Для получения более подробной информации, пожалуйста, смотрите: Кодирование.Метод GetBytes (System.Text) | Microsoft Docs[^]

Если вы хотите перейти в другую веру result в строку, используйте это:
string s = u8.GetString(result);


Примечание: Как отметил Ричард Маккатчан в комментарии к этому вопросу, у вас есть неправильный escape-символ для двух шестнадцатеричных значений. Я не стал исправлять это, потому что хотел привести пример преобразования списка строк в байтовый массив.

Удачи вам!


Richard MacCutchan

Неправильная последовательность на две шестнадцатеричные значения.

Maciej Los

Согласен, но я хотел показать, как нужно обращать list<string> в массив байтов.

Richard MacCutchan

Кроме того, когда я запустил его, он добавляет произвольный 0xC2 между первыми двумя значениями. Есть идеи, почему?

Maciej Los

Из-за шестнадцатеричной строки ;)
Для преобразования шестнадцатеричной строки в байтовый массив необходимо добавить дополнительное преобразование: c# - как я могу преобразовать шестнадцатеричную строку в массив байтов? - переполнение стека[^]

Gilcecler Carneiro

Я исправил, спасибо.

stValue = "748";
listaDados.Добавить("\на сайте x1b");
listaDados.Добавить("\xA2");
listaDados.Добавить(stValue);

Gilcecler Carneiro

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



instanciaDoForm1 = frm1;

Строка stValue;
Список<строка> У listaDados = новый список<строка&ГТ;();
Ящик для сообщений.Показать("оплатить чеком");

//Favorecido
stValue = "JHON FAVORECIDO";
listaDados.Добавить("\на сайте x1b");
listaDados.Добавить("\xA0");
listaDados.Добавить(stValue);
listaDados.Добавить("\x0D");
Кодирование У8 = кодировка.Кодировке utf8;
byte[] result = listaDados.SelectMany(x => u8.GetBytes(x)).Метод toArray();

instanciaDoForm1.Porta.Write(result, 0, result.Длина);

//местный
stValue = "Франсиско БЕЛЬТРАО";
listaDados.Добавить("\на сайте x1b");
listaDados.Добавить("\xA1");
listaDados.Добавить(stValue);
listaDados.Добавить("\x0D");
Кодирование У8 = кодировка.Кодировке utf8;
byte[] result = listaDados.SelectMany(x => u8.GetBytes(x)).Метод toArray();
instanciaDoForm1.Porta.Write(result, 0, result.Длина);
//Банк
stValue = "748";
listaDados.Добавить("\на сайте x1b");
listaDados.Добавить("\xA2");
listaDados.Добавить(stValue);
Кодирование У8 = кодировка.Кодировке utf8;
byte[] result = listaDados.SelectMany(x => u8.GetBytes(x)).Метод toArray();
instanciaDoForm1.Porta.Write(result, 0, result.Длина);
//Доблесть
stValue = "12350,50";
listaDados.Добавить("\на сайте x1b");
listaDados.Добавить("\xA3");
listaDados.Добавить(stValue);
listaDados.Добавить("\x0D");
Кодирование У8 = кодировка.Кодировке utf8;
byte[] result = listaDados.SelectMany(x => u8.GetBytes(x)).Метод toArray();
instanciaDoForm1.Porta.Write(result, 0, result.Длина);

//Данные
stValue = "01/10/2019";
listaDados.Добавить("\на сайте x1b");
listaDados.Добавить("\xA4");
listaDados.Добавить(stValue);
listaDados.Добавить("\x0D");
Кодирование У8 = кодировка.Кодировке utf8;
byte[] result = listaDados.SelectMany(x => u8.GetBytes(x)).Метод toArray();
instanciaDoForm1.Porta.Write(result, 0, result.Длина);

// Inicia a Impressao com dados enviados
listaDados.Добавить("\на сайте x1b");
listaDados.Добавить("\xB0");
listaDados.Добавить("\x0D");

Кодирование У8 = кодировка.Кодировке utf8;
byte[] result = listaDados.SelectMany(x => u8.GetBytes(x)).Метод toArray();
instanciaDoForm1.Porta.Write(result, 0, result.Длина);