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), что может привести к неправильной интерпретации байтов. Вам следует предпринять шаги для повышения надежности отправки сообщений (например, путем добавления контрольной суммы и игнорирования значений, контрольные суммы которых недействительны или отсутствуют).