C # Сокет байтовый массив - PullRequest
0 голосов
/ 19 марта 2019

Хорошо, я получаю байты из запроса.

Я звоню, чтобы прочитать байты

        byte[] buffer = new byte[1024];
        int resp = socket.Receive(buffer);

Если я использую это,

 Console.WriteLine(resp)

возвращает целое число 9, что означает, что получено 9 байтов

когда я использую

 int byte1 = buffer[0];
 Console.WriteLine(byte1);

возвращает

0

так тогда, когда я использую

        long bytelong = BitConverter.ToInt64(buffer, 0);
        Console.WriteLine(bytelong);

Я бы ожидал

 0( + other 7 bytes from the array )

но я получаю

 -1249284928492

что неверно, потому что я знаю, что первый байт

0

Действительно перепутал с этим ..

1 Ответ

0 голосов
/ 19 марта 2019

Невозможно узнать из приведенной информации, в чем конкретно заключается ваша конкретная проблема, но вот несколько общих советов по отладке сетевых соединений, которые могут помочь.

Самое важное - это уметь точно видеть, что именноданные отправляются и принимаются до того, как они будут интерпретированы и преобразованы приложением (ями).Лучший способ сделать это - использовать внешнее программное обеспечение для мониторинга линии, такое как WireShark .Если вы собираетесь много заниматься этим, познакомьтесь с таким инструментом.

Но для большинства работ это, вероятно, излишне.Просто зарегистрируйте фактические байты, которые вы отправляете и получаете до , когда вы конвертируете их, например:

var count = socket.Receive(buffer);
Console.WriteLine("Received {0} bytes: {1}", count, BitConverter.ToString(buffer, 0, count));

Во-вторых, помните о проблемах порядка байтов , когдаинтерпретировать поток байтов как двоичные целые числа.Если вы точно не знаете, что и отправитель, и получатель будут использовать один и тот же порядок байтов, рассмотрите возможность использования Сетевой порядок байтов (он же Big Endian) для ваших многобайтовых двоичных значений.

Например, если ваше приложение с сокетом c # запущено в Windows, ваше 64-битное целочисленное значение, вероятно, будет сохранено как младший порядок:

long le_value = 0x0807060504030201; // "01-02-03-04-05-06-07-08"
long be_value = IPAddress.HostToNetworkOrder(le_value); // "08-07-06-05-04-03-02-01"

Чтобы преобразовать полученное значение порядка байтов в сети обратно вlittle endian:

ulong le_value = IPAddress.NetworkToHostOrder(be_value);

Надеюсь, это поможет.

...