Как преобразовать int в байтовый массив с прямым порядком байтов? - PullRequest
24 голосов
/ 28 февраля 2010

У меня есть эта функция в C # для преобразования байтового массива с прямым порядком байтов в целое число:

int LE2INT(byte[] data)
{
  return (data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0];
}

Теперь я хочу преобразовать его обратно в little endian .. Что-то вроде

byte[] INT2LE(int data)
{
  // ...
}

Есть идеи?

Спасибо.

Ответы [ 8 ]

21 голосов
/ 15 февраля 2013

Для этого можно использовать класс BitConverter, и, конечно же, его можно использовать как для систем с прямым и младшим порядком байтов.

Конечно, вам придется отслеживать порядковый номер ваших данных. Например, для связи это будет определено в вашем протоколе.

Затем вы можете использовать класс BitConverter для преобразования типа данных в байтовый массив и наоборот, а затем использовать флаг IsLittleEndian, чтобы узнать, нужно ли вам преобразовывать его в вашей системе.

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

Это со страницы MSDN класса BitConverter.

  int value = 12345678; //your value
  //Your value in bytes... in your system's endianness (let's 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.

Полный текст статьи можно найти здесь .

Надеюсь, это поможет любому, кто придет сюда:)

20 голосов
/ 28 февраля 2010

Просто переверните его, Обратите внимание, что этот код (как и другой) работает только на маленькой машине с порядком байтов. (правка - это неправильно, так как этот код возвращает 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;
  }
7 голосов
/ 28 февраля 2010

Просто сделайте это в обратном порядке:

result[3]= (data >> 24) & 0xff;
result[2]= (data >> 16) & 0xff;
result[1]= (data >> 8)  & 0xff;
result[0]=  data        & 0xff; 
3 голосов
/ 28 февраля 2010

Не могли бы вы использовать BitConverter класс? Я верю, что он будет работать только на оборудовании с прямым порядком байтов, но он должен справиться с большей частью тяжелой работы за вас.

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

        if(BitConverter.IsLittleEndian)
        {
            int someInteger = 100;
            byte[] bytes = BitConverter.GetBytes(someInteger);
            int convertedFromBytes = BitConverter.ToInt32(bytes, 0);
        }
2 голосов
/ 17 марта 2015
BitConverter.GetBytes(1000).Reverse<byte>().ToArray();
0 голосов
/ 10 апреля 2017

Вы можете использовать это, если вы не хотите использовать новые выделения кучи:

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);
}
0 голосов
/ 23 мая 2012
 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;
    }
0 голосов
/ 28 февраля 2010

В зависимости от того, что вы на самом деле делаете, вы можете рассчитывать на то, что инфраструктура будет обрабатывать детали порядка байтов для вас, используя IPAddress.HostToNetworkOrder и соответствующую функцию реверса. Затем просто используйте класс BitConverter для перехода к байтовым массивам и обратно.

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