Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Cha1000000
5 / 4 / 3
Регистрация: 04.06.2015
Сообщений: 243
Записей в блоге: 1
1

Что-то не так с Encoding данных туда и обратно: byte в string и обратно в byte

26.01.2018, 20:55. Просмотров 434. Ответов 2
Метки нет (Все метки)

Добрый день, коллеги!
Столкнулся с такой проблемой, причём заметил её не сразу ("вроде бы всё работало").
В общем сразу к делу. Есть такой не большой участок кода:
C#
1
2
3
4
5
6
7
8
9
10
11
public static void SReports(int type, string text)
        {
            byte cmd = 0; // код команды
            if (type == 0)
                cmd = 0x9A;
            if (type == 1)
                cmd = 0x67;
            string data = (Encoding.Default.GetString(new byte[] { cmd }) + text ); // данные
            byte[] b = Encoding.GetEncoding(866).GetBytes(data); //эта строка просто для отладки
            SendCommand(data); // отправка команды
        }
далее в функции void SendCommand(string Data) формируется байтовый буфер таким образом:
C#
1
2
3
4
5
6
7
. . .
String Data = Encoding.Default.GetString(new byte[] { 0x02 })
                 + Data
                 + Encoding.Default.GetString(new byte[] { 0x03});
 
var databuffer = Encoding.GetEncoding(866).GetBytes(Data);
. . .
Но эта часть так для общего представления... Проблему можно увидеть уже в первом блоке в "строке для отладки".
Дело в том, что cmd - это переменная для кодов команд, они формата HEX, но после всех Encoding'ов (сначала из байта в строку перевели, а после присоединения других строковых данных, обратно в байт переводим) проиходят чудеса и пакость.
Я в начале писал, что заметил это не сразу, т.к. если cmd принимает значения формата: "0х цифра цифра" (вот как в примере выше cmd = 0x67, то всё нормально и ту и обратно энкодится, т.е. после всех преобразований, в переменной byte[] b я вижу тот же код, что и был передан переменной cmd, а если после 0х присутствует буква, как выше: cmd = 0x5A, то после всех преобразований я в byte[] b вижу вместо 0х9А, другое значение (0x3F, если уж совсем конкретно для этого случая)!
А мне нужно получать обратно значение, как было задано переменной byte cmd в начале!
Как это одолеть, или где я что упустил и делаю не верно? Подскажите пожалуйста!!!

P.S. или может кто предложит короткий и адекватный способ "склейки" байт (или массивов байт) в один цельный массив байт, без внедрения дополнительных буферных массивов байт... Так я и сам могу, но не хочу так делать, хочется компактно и красиво оформить код. А костыльных вариантов (при которых я даже точно знаю, что будет работать) у меня и так парочка есть)) но хотелось бы всё же не прибегнуть к ним)
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2018, 20:55
Ответы с готовыми решениями:

Данные из ArrayList в byte[] и обратно
Собственно вопрос в названии...как же всётаки это можно сделать. пробовал через ToArray()..не...

Преобразовать String в Byte[] без использования Encoding
Всем доброго времени суток :) В общем возникла "проблема" имеем код - byte Send = new byte {...

Получение данных из БД формата byte и форматирование в string
Добрый день. Получаю через reader данные из sql базы. Они в формате byte (varbinary). Как...

преобразование ref byte в byte[] или в IntPtr без использования неуправляемого кода
есть COM интерфейс с методом: virtual /* */ HRESULT STDMETHODCALLTYPE OnReceivePacket( ...

Как перевести byte[] или переменную типа IntPtr к типу byte[] (ассемблерные инструкции)?
Наткнулась на проблему, нужно перевести тип IntPtr в массив ассемблерной инструкции. Вот пример...

2
Someone007
3226 / 2398 / 1070
Регистрация: 09.05.2015
Сообщений: 5,938
Завершенные тесты: 1
26.01.2018, 21:10 2
По моему костыльный это как раз вариант выше. Мало того что туда-сюда конвертируете, так еще и массивы все равно создаете... По нормальному делайте, без всяких преобразований строк.

C#
1
2
3
4
5
6
7
using (MemoryStream ms = new MemoryStream())
using (BinaryWriter bw = new BinaryWriter(ms))
{
    bw.Write(command);
    bw.Write(text);
    byte[] array = ms.ToArray();
}
0
Cha1000000
5 / 4 / 3
Регистрация: 04.06.2015
Сообщений: 243
Записей в блоге: 1
26.01.2018, 22:40  [ТС] 3
Цитата Сообщение от Someone007 Посмотреть сообщение
делайте, без всяких преобразований строк
Ох ты! Классная тема! Не знал, что так можно! Так прошло. А что это получается, такой конструкцией, в массив байт можно перегонять данные из переменных вообще разных типов? Офигенно! Это просто находка для меня! Спасибо огромное!
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2018, 22:40

Пердача byte[] COM-функции, ожидающей ref byte
Привет, наше приложение в C# использует несколько COM-интерфейсов. В одном из них есть метод,...

Закодировать byte[] в string и обратно
Подскажите пожалуйста где ошибка и как правильно сделать. Надо передать byte. В этом массиве имя...

Byte array to string и обратно
Добрый день! Имею на входе массив байт полученный из метода byte str = SignFile();...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru