Символы выше 127 не будут правильно преобразованы в байт - PullRequest
0 голосов
/ 28 июня 2019

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

public class Constants
{
     public constant char TOP3_REQUEST_CODE = (char)148;
}

public void printTopThree()
{
    string request = Constants.TOP3_REQUEST_CODE.ToString();
    string response = SendAndRecive (Constants.PORT, Constants.IP, request, Globals.SOCKET);
    //The rest isn't relevant.

public string SendAndRecive(string port, string ip, string request, Socket socket)
{
    Byte[] bytesSend = Encoding.ASCII.GetBytes(request);
    Console.WriteLine(request [0]);
    Console.WriteLine(bytesSend[0]);
    //The program continues but its not relevant.
}

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

Вывод: 148 63

Первый символ в запросе - это код сообщения (бывает 148), но после преобразования первый байт равен 63.

Мои вопросы: 1. Как я могу это исправить? Есть ли какая-то другая кодировка, которая может решить мою проблему? 2. Почему это происходит в любом случае?

РЕДАКТИРОВАТЬ: запрос выглядит так (в целом): 1-й байт: (символ) код (20 100 148 и т. Д.) 2 - 4 байта: (int) длина (длина объекта JSON, длина может быть 1, 2 или 3 байта) 5-й - X байт: (символ) JsonObject (преобразован в символ [])

Спасибо за ваше время и внимание - Anthon

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Спасибо всем вам, @Lasse Vågsæther Karlsen и @Marc Gravell ♦ где угодно, используйте UTF-8.

0 голосов
/ 28 июня 2019

Строки и символы в C # не используют однобайтовые кодировки.Вы должны использовать кодировку Unicode, которую CLR использует под капотом:

Byte[] bytesSend = Encoding.Unicode.GetBytes(request);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...