С# int to byte []

Мне нужно преобразовать int в byte[], один из способов сделать это - использовать BitConverter.GetBytes(). Но im unsure, если это соответствует следующей спецификации:

Целочисленное целое XDR - это 32-разрядная система координат, которая кодирует целое число в    диапазон [-2147483648,2147483647]. Целое число представлено в    две дополнения. Наиболее и наименее значимые байты    0 и 3 соответственно. Целые объявляются следующим образом:

Источник: RFC1014 3.2

Как я могу сделать преобразование int в байты, которое удовлетворяет вышеуказанной спецификации?

Ответ 1

RFC просто пытается сказать, что целое число со знаком является нормальным 4-байтовым целым числом с байтами, упорядоченными по-большому.

Теперь вы, скорее всего, работаете на малоэтажном компьютере, а BitConverter.GetBytes() предоставит вам byte[] обратный. Поэтому вы можете попробовать:

int intValue;
byte[] intBytes = BitConverter.GetBytes(intValue);
Array.Reverse(intBytes);
byte[] result = intBytes;

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

int intValue;
byte[] intBytes = BitConverter.GetBytes(intValue);
if (BitConverter.IsLittleEndian)
    Array.Reverse(intBytes);
byte[] result = intBytes;

Ответ 2

Вот еще один способ сделать это: поскольку все мы знаем 1x байт = 8x бит, а также "регулярное" целое число (int32) содержит 32 бита (4 байта). Мы можем использовать оператор → для смещения битов вправо ( → оператор не меняет значение.)

int intValue = 566;

byte[] bytes = new byte[4];

bytes[0] = (byte)(intValue >> 24);
bytes[1] = (byte)(intValue >> 16);
bytes[2] = (byte)(intValue >> 8);
bytes[3] = (byte)intValue;

Console.WriteLine("{0} breaks down to : {1} {2} {3} {4}",
    intValue, bytes[0], bytes[1], bytes[2], bytes[3]);

Ответ 3

BitConverter.GetBytes(int) почти делает то, что вы хотите, за исключением того, что это неверно.

Вы можете использовать метод IPAddress.HostToNetwork для замены байтов в пределах целочисленного значения перед использованием BitConverter.GetBytes или использования Jon Skeet < класс href= "https://stackoverflow.com/questions/217980/c-little-endian-or-big-endian/217993#217993" > EndianBitConverter. Оба метода делают правильную вещь (tm) относительно переносимости.

int value;
byte[] bytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(value));

Ответ 4

Когда я смотрю на это описание, у меня возникает ощущение, что это целое число xdr является просто "стандартным" целым числом, но оно выражается самым запутанным образом. Обозначение двух дополнений лучше известно как U2, и это то, что мы используем на современных процессорах. Порядок байтов указывает, что это big-endian. Итак, отвечая на ваш вопрос, вы должны инвертировать элементы в вашем массиве (0 ↔ 3, 1 ↔ 2), поскольку они закодированы в little-endian. Чтобы убедиться, вы должны сначала проверить BitConverter.IsLittleEndian, чтобы узнать, на каком компьютере вы работаете.