Недопустимый символ при чтении потока данных, полученных сервером, как мне это исправить? - PullRequest
0 голосов
/ 22 мая 2019

Подробности о приложении:

  • Разработано в Visual Studio 2019 (Windows 10)
  • Разработано на платформе UWP с C # и языком XAML

Приложение получает информацию с удаленного сервера. Соединение через сокет используется для связи между двумя сторонами.

Сервер отправил по кадрам сообщение, и в этом сообщении мы находим несколько существенных элементов, каждый из которых имеет размер и свое определение, как можно видеть ниже:

Содержание каждого сообщения:

- Name: ID Message / Type : UINT16 / Size : 4 bytes
- Name: ID Device/ Type : UINT8 / Size : 4 bytes
- Name: Temperature / Type : UINT16 / Size : 4 bytes
- Name: Activation / Type : BOOLEAN / Size : 4 bytes
- Name: Weather / Type : STRING[32] / Size : 16 bytes

Для восстановления данных, передаваемых через сокет, в приложении есть фоновая задача, которая занимается извлечением всей информации.

Вот мой код, который поэтому находится в фоновом режиме:

StreamReader reader;
int SizeBuffer = 2048;
int SizeReceive = 0;

reader = new StreamReader(socket.InputStream.AsStreamForRead());
string result;

result = "";
while (true)
{
    char[] buffer = new char[SizeBuffer];
    SizeReceive = await reader.ReadAsync(buffer, 0, SizeBuffer);

    int i = 0;

    Debug.WriteLine("Text 1 : ")
    while (i < 2047)
    {
        Debug.WriteLine(buffer[i]);
        i++;
    }

    string data = new string(buffer);

    if (data.IndexOf("\0") >= 0 || reader.EndOfStream)
    {
        result = data.Substring(0, data.IndexOf("\0"));
        break;
    }
    result += data;
}

Debug.WriteLine("Text 2 : " + result);
dataString = result;

Я использую два Debug.WriteLine s, чтобы увидеть мои входящие данные.

Вот в чем проблема. Для сообщения Text1 я получаю такой символ: ������������������������

А для сообщения Text2 я получаю один символ:

Как я могу полностью получить свое сообщение и сохранить его в каждом из перечисленных выше параметров в зависимости от его типа и соответствующего размера?

Ответы [ 2 ]

1 голос
/ 22 мая 2019

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

Конструктор StreamReader по умолчанию с одним аргументом использует кодировку UTF-8. Возможно, ваш сервер отправляет данные в другой кодировке.

Попробуйте явно указать кодировку с помощью конструктора StreamReader(stream, encoding) .

0 голосов
/ 23 мая 2019

Вот решение:

try
{
    DataReader reader1 = new DataReader(socket.InputStream);
    reader1.InputStreamOptions = InputStreamOptions.Partial;
    uint numFileBytes = await reader1.LoadAsync(2048);
    byte[] byArray = new byte[numFileBytes];
    reader1.ReadBytes(byArray);
    string test = BitConverter.ToString(byArray);

    Debug.WriteLine("Conversion : " + test);
}
catch (Exception exception)
{
    Debug.WriteLine("ERROR LECTURE : " + exception.Message);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...