С# 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
, чтобы узнать, на каком компьютере вы работаете.
Ответ 5
Если вы хотите получить более общую информацию о различных методах представления чисел, включая Two Complement, посмотрите:
Two Complement и Представление номерного знака в Википедия