@miXtik789

Hе получается преобразовать символы в byte, как сделать так чтобы это работало?

Есть код который преобразовывает string в byte:
byte[] data = Encoding.Unicode.GetBytes(message);
И который расшифровывает:
int bytes = 0; // количество полученных байтов
                        byte[] data = new byte[256]; // буфер для получаемых данных

                        do
                        {
                            bytes = handler.Receive(data);
                            builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
                        }
                        while (handler.Available > 0);

С текстом всё работает нормально
Но если ввести сообщение скажем "@#$^@"
то в итоге будет пустота как сделать так чтобы работало с символами?
  • Вопрос задан
  • 71 просмотр
Решения вопроса 1
ayazer
@ayazer
Sr. Software Engineer
var str = "test12!#@<смайлик>";

var utf16bytes = Encoding.Unicode.GetBytes(str);
var utf16reversed = Encoding.Unicode.GetString(utf16bytes); #test12!#@<смайлик>


вы что-то где-то путаете, проверяйте свой хендлер и то, как и в какой кодировке вы данные отправляете. та-же разница в BE/LE между машинами может к веселым багам приводить. Ну и в целом - так как делаете вы - делать нельзя. Если у вас на 256 СИМВОЛ попадет "<смайлик>" (т.е. суррогат, который состоит с 2ух реальных символов), но у вас возникнет ошибка при декодинге. Потому как минимум - нужно использовать енкодер со состоянием (var enc = Encoding.Unicode.GetEncoder(); ...). Ну или реализовать это самому через проверку char.IsLowSurrogate/char.IsHighSurrogate.

UPD: даже у тостера оказывается проблема с суррогатами, вместо <смайлик> должен был быть U+1F60A ( https://www.compart.com/en/unicode/U+1F60A)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
Потому что Encoding.Unicode - это UTF-16 и в нём просто текст @#$^@ не эквивалентен тому же самому в байтах (можете попробовать сами сконвертировать этот стринг в байты). Скорее всего вам нужно использовать энкодер UTF-8.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы