Отправка значений HEX через пакет в C # - PullRequest
0 голосов
/ 19 сентября 2011

У меня сейчас есть следующее:

N.Sockets.UdpClient UD;

UD = new N.Sockets.UdpClient();
UD.Connect("xxx.xxx.xxx.xxx", 5255);
UD.Send( data, data.Length );

Как бы я отправил данные в шестнадцатеричном формате? Я не могу просто сохранить его прямо в массив байтов.

1 Ответ

1 голос
/ 19 сентября 2011

Hex это просто кодировка. Это просто способ представления числа. Компьютер работает только с битами и байтами - он не имеет понятия "шестнадцатеричный".

Таким образом, любое число, представленное в шестнадцатеричном, десятичном или двоичном виде, может быть закодировано в серию байтов:

var data = new byte[] { 0xFF };

И любая шестнадцатеричная строка может быть преобразована в число (используя, например, int.Parse()).

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

В C # int 4 байта. Внутренне, в зависимости от порядка байтов ЦП, старший значащий байт (цифры с наибольшим значением) может быть сохранен первым (с прямым порядком байтов) или последним (с прямым порядком байтов). Как правило, big-endian используется в качестве стандарта для связи по сети (помните, что отправитель и получатель могут иметь ЦП с разным порядком байтов). Но, поскольку вы отправляете необработанные байты вручную, я предполагаю, что вы также читаете необработанные байты вручную на другом конце; если это так, вы, конечно, можете использовать любой произвольный формат, который вам нравится, при условии, что клиент может понять этот формат однозначно.

Чтобы кодировать int в порядке с прямым порядком байтов, вы можете сделать:

int num = 0xdeadbeef;
var unum = (uint)num;    // Convert to uint for correct >> with negative numbers
var data = new[] {
    (byte)(unum >> 24),
    (byte)(unum >> 16),
    (byte)(unum >> 8),
    (byte)(unum)
};

Имейте в виду, что некоторые пакеты могут никогда не дойти до клиента (это основное практическое различие между TCP и UDP), что может привести к неправильной интерпретации байтов. Вам следует предпринять шаги для повышения надежности отправки сообщений (например, путем добавления контрольной суммы и игнорирования значений, контрольные суммы которых недействительны или отсутствуют).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...