-2

重複の可能性:
異なる値型の配列をバイト配列に変換します

6つのfloatがあり、それらをfloatの配列に入れてから、バイトに変換する必要があります。さあ行こう:

float x= g.transform.position.x;
float y= g.transform.position.y;
float z= g.transform.position.z;
float alpha = g.transform.rotation.eulerAngles.x;
float theta = g.transform.rotation.eulerAngles.y;
float phi =  g.transform.rotation.eulerAngles.z;

floatの配列をbyte配列に変換する最良の方法は何ですか?

4

5 に答える 5

2
byte[] data = new float[]{x,y,z,alpha,theta,phi}
                  .SelectMany(f => BitConverter.GetBytes(f)).ToArray();

または(消費者のコンピュータアーキテクチャに応じて)

byte[] data = new float[]{x,y,z,alpha,theta,phi}
              .SelectMany(f => BitConverter.GetBytes(f).Reverse()).ToArray();

BitConverter.IsLittleEndian@CodesInChaosが提案したように、どちらを選択するかを決定するために使用することもできます

于 2012-11-28T08:48:59.850 に答える
0

ネイティブエンディアンとLINQが受け入れられる場合、LBの答えは問題ありません。一貫した(少しの)エンディアンが必要な場合は、:を使用しBinaryWriterます。

using(var stream = new MemoryStream())
using(var writer = new BinaryWriter(stream))
{
   writer.Write(x);
   writer.Write(y);
   ...
   return stream.ToArray();
}

ビッグエンディアンを使用する場合は、次のヘルパーメソッドを使用できます。

byte[] GetBytesBigEndian(float f)
{
  var bytes = BitConverter.GetBytes(f);
  if(BitConverter.IsLittleEndian)
    Array.Reverse(bytes);
  return bytes;
}

using(var stream = new MemoryStream())
using(var writer = new BinaryWriter(stream))
{
   writer.Write(GetBytesBigEndian(x));
   writer.Write(GetBytesBigEndian(y));
   ...
   return stream.ToArray();
}

それが遅すぎる場合は、unsafeそれを少しスピードアップできるいくつかのトリックもあります。

于 2012-11-28T08:55:26.617 に答える
0
float[] source = new float[100];
byte[] dest = new byte[source.Length * sizeof(float)];
Buffer.BlockCopy(source, 0, dest, 0, dest.Length);
于 2012-11-28T08:53:32.587 に答える
0

次のようなものを試してください:

var farray = new float[] {12.4f, 12.3f, 4.5f}; // or what ever values you want.
var bArray = new byte[farray.Length];
Buffer.BlockCopy(farray, 0, bArray, 0, bArray.Length);
        foreach (byte value in bArray)
            Console.Write("{0}  ", value);

詳細については、 MSDNをご覧ください。

お役に立てれば。

于 2012-11-28T08:54:50.157 に答える
0

これが生意気な方法です:

float x = 1F;
float y = 2F;
float z = 3F;
float alpha = 4F;
float theta = 5F;
float phi = 6F;
byte[] raw = new byte[6 * sizeof(float)];
fixed (byte* ptr = raw)
{
    float* typed = (float*)ptr;
    typed[0] = x;
    typed[1] = y;
    typed[2] = z;
    typed[3] = alpha;
    typed[4] = theta;
    typed[5] = phi;
}
return raw;

ただし、エンディアンについては推測することに注意してください。BitConverter.IsLittleEndian必要に応じて、各4バイトのチャンクをチェックして反転することをお勧めします。

もちろん、既存のバッファを再利用できるのであれば、それが望ましいです。同じアプローチ-byte[]毎回新しいものを作成するのではなく、既存のものをパラメータとして渡すだけです。

于 2012-11-28T09:25:37.747 に答える