NetworkStream.read () читает все байты, но не преобразуется в строку - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь прочитать ответ сервера при попытке войти в систему, используя networkStream.read(), используя следующий код:

if (connectionStream.DataAvailable && connectionStream.CanRead)
{
    byte[] myReadBuffer = new byte[64];
    string responseMessage = string.Empty;
    int numberOfBytesRead = 0;
    do
    {
        numberOfBytesRead = connectionStream.Read(myReadBuffer, 0, myReadBuffer.Length);
        responseMessage = Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead);

    } while (connectionStream.DataAvailable);

    Debug.Log("Message:" + responseMessage);

    #breakpoint 
    if (responseMessage.Contains("OK"))
    {
        Debug.Log("logon sucessful");
    }
    else
    {
        Debug.LogError("Logon denied!");
    }
}

Проверяя мои локальные переменные в breakpoint, я знаю Read() выполняется без проблем, поскольку numberOfBytesRead установлен на 32, а myReadBuffer заполнен 32 байтами (все байты в myReadBuffer соответствуют байтам, отправленным сервером).Однако после попытки извлечь строку из myReadbuffer с помощью Encoding.ASCII.GetString() строка все еще пуста (Visual Studio также сообщает, что она пуста в точке останова), даже если myReadBuffer не является.

Байтыв myReadBuffer читать:

32 0 0 0
1 0 0 0
0 0 0 0
76 79 71 79
78 58 32 48
59 79 75 59
32 83 83 61
54 66 67 0

, что переводится как: _ _ _ _ _ _ _ _ _ _ L O G O N : 0 ; O K ; S S = 5 A 8 _

Есть предложения относительно того, что может вызвать это?

1 Ответ

0 голосов
/ 04 октября 2018

Ответ от сервера содержит несколько null ('\0') символов.Несмотря на то, что в документах по Strings (C #) говорится о нулевом завершении в C #:

В конце строки C # нет символа, заканчивающегося нулем;поэтому строка C # может содержать любое количество встроенных нулевых символов ('\ 0').

Кажется, что Unity не соответствует этому, и на самом деле действительно завершает строку послевстречен символ null.Хотя я не мог найти никаких ссылок на это в документах Unity.

Исправление, которое я закончил, заключалось в замене нулевых символов пробелами (также можно полностью удалить нулевые символы, но я хочу знать, что символы были там в какой-то момент), например так: responseMessage = responseMessage.Replace('\x0', '\x0020');

При создании этого поста я понял, но не могу найти никаких других постов на SO, описывающих мою проблему.Так что отвечаю сам за будущие ссылки.Если у кого-то есть какие-либо другие / лучшие решения или дополнительная информация, я все равно буду рад услышать / принять это.

...