web-dev-qa-db-ja.com

intをリトルエンディアンバイト配列に変換する方法は?

リトルエンディアンのバイト配列を整数に変換するC#のこの関数があります。

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

今度はそれをリトルエンディアンに戻したいと思います。

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

何か案が?

ありがとう。

27
drowneath

ちょうどそれを逆にし、 このコード(他のコードと同様)はリトルエンディアンマシンでのみ機能することに注意してください。 (編集-このコードは定義により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;
  }
21
John Knoeller

BitConverterクラスはこれに使用でき、もちろん、リトルエンディアンシステムとビッグエンディアンシステムの両方で使用することもできます。

もちろん、データのendiannessを追跡する必要があります。たとえば通信の場合、これはプロトコルで定義されます。

次に、BitConverterクラスを使用してデータ型をバイト配列に、またはその逆に変換し、次にIsLittleEndianフラグを使用して、システムで変換する必要があるかどうかを確認できます。

IsLittleEndianフラグはシステムのendiannessを通知するため、次のように使用できます。

これは、BitConverterクラスのMSDNページからのものです。

  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.

あなたは完全な記事を見つけることができます ここ

これがここに来る人を助けることを願っています:)

23
Wracky

それを逆に行うだけです:

result[3]= (data >> 24) & 0xff;
result[2]= (data >> 16) & 0xff;
result[1]= (data >> 8)  & 0xff;
result[0]=  data        & 0xff; 
7
MSN

BitConverter クラスを使用できますか?それは私が信じているリトルエンディアンのハードウェアでのみ動作しますが、重い作業のほとんどを処理できます。

以下は、クラスの使用を説明する不自然な例です。

        if(BitConverter.IsLittleEndian)
        {
            int someInteger = 100;
            byte[] bytes = BitConverter.GetBytes(someInteger);
            int convertedFromBytes = BitConverter.ToInt32(bytes, 0);
        }
3
Eric
BitConverter.GetBytes(1000).Reverse<byte>().ToArray();
2
Serban Lucian

IPAddress.HostToNetworkOrder と対応する逆関数を使用することにより、実際に何をしているのかに応じて、フレームワークにエンディアンの詳細を処理させることができます。次に、BitConverterクラスを使用して、バイト配列との間で移動します。

0
MikeP

新しいヒープ割り当てを使用したくない場合は、これを使用できます。

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
Mendi Barel
 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
Sean Campbell