Как преобразовать int в маленький массив байтов endian?
У меня есть эта функция в С# для преобразования небольшого массива endian byte в целое число:
int LE2INT(byte[] data)
{
return (data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0];
}
Теперь я хочу преобразовать его обратно в маленький endian.
Что-то вроде
byte[] INT2LE(int data)
{
// ...
}
Любая идея?
Спасибо.
Ответы
Ответ 1
Просто отмените его, Обратите внимание, что этот код (как и другой) работает только на небольшой машине Endian. (edit - это было неправильно, так как этот код возвращает LE по определению)
byte[] INT2LE(int data)
{
byte[] b = new byte[4];
b[0] = (byte)data;
b[1] = (byte)(((uint)data >> 8) & 0xFF);
b[2] = (byte)(((uint)data >> 16) & 0xFF);
b[3] = (byte)(((uint)data >> 24) & 0xFF);
return b;
}
Ответ 2
Для этого может использоваться класс BitConverter
, и, конечно же, он также может использоваться как для малых, так и для больших систем.
Конечно, вам нужно будет отслеживать достоверность ваших данных. Например, для связи это будет определено в вашем протоколе.
Затем вы можете использовать класс BitConverter
для преобразования типа данных в массив байтов и наоборот, а затем использовать флаг IsLittleEndian
, чтобы узнать, нужно ли его преобразовывать в вашу систему или нет.
Флаг IsLittleEndian
сообщит вам о контенте системы, поэтому вы можете использовать его следующим образом:
Это со страницы MSDN в классе BitConverter
.
int value = 12345678; //your value
//Your value in bytes... in your system endianness (let say: little endian)
byte[] bytes = BitConverter.GetBytes(value);
//Then, if we need big endian for our protocol for instance,
//Just check if you need to convert it or not:
if (BitConverter.IsLittleEndian)
Array.Reverse(bytes); //reverse it so we get big endian.
Вы можете найти полную статью здесь.
Надеюсь, это поможет любому, кто придет сюда:)
Ответ 3
Просто сделайте это в обратном порядке:
result[3]= (data >> 24) & 0xff;
result[2]= (data >> 16) & 0xff;
result[1]= (data >> 8) & 0xff;
result[0]= data & 0xff;
Ответ 4
Не могли бы вы использовать класс BitConverter? Это будет работать только на небольших аппаратных средствах, которые я считаю, но он должен справиться с большей частью тяжелой работы для вас.
Ниже приведен надуманный пример, иллюстрирующий использование класса:
if(BitConverter.IsLittleEndian)
{
int someInteger = 100;
byte[] bytes = BitConverter.GetBytes(someInteger);
int convertedFromBytes = BitConverter.ToInt32(bytes, 0);
}
Ответ 5
public static string decimalToHexLittleEndian(int _iValue, int _iBytes)
{
string sBigEndian = String.Format("{0:x" + (2 * _iBytes).ToString() + "}", _iValue);
string sLittleEndian = "";
for (int i = _iBytes - 1; i >= 0; i--)
{
sLittleEndian += sBigEndian.Substring(i * 2, 2);
}
return sLittleEndian;
}
Ответ 6
BitConverter.GetBytes(1000).Reverse<byte>().ToArray();
Ответ 7
В зависимости от того, что вы на самом деле делаете, вы можете рассчитывать на то, что фреймворк обработает данные о endianness для вас, используя IPAddress.HostToNetworkOrder и соответствующей обратной функции. Затем просто используйте класс BitConverter для перехода к массивам байтов и из них.
Ответ 8
Вы можете использовать это, если не хотите использовать новые распределения кучи:
public static void Int32ToFourBytes(Int32 number, out byte b0, out byte b1, out byte b2, out byte b3)
{
b3 = (byte)number;
b2 = (byte)(((uint)number >> 8) & 0xFF);
b1 = (byte)(((uint)number >> 16) & 0xFF);
b0 = (byte)(((uint)number >> 24) & 0xFF);
}