0 から始まらないバッファに対して GetBytes を実行する、より苦痛の少ない方法はありますか?
-
22-09-2019 - |
質問
プロジェクトで生のバイトを処理する必要があり、基本的に次のようなことを行う必要があります
byte[] ToBytes(){
byte[] buffer=new byte[somelength];
byte[] tmp;
tmp=BitConverter.GetBytes(SomeShort);
buffer[0]=tmp[0];
buffer[1]=tmp[1];
tmp=BitConverter.GetBytes(SomeOtherShort);
buffer[2]=tmp[0];
buffer[3]=tmp[1];
}
これはとても間違っていると感じていますが、それを行うより良い方法が見つかりません。もっと簡単な方法はありますか?
解決
BinaryWriter非常に効率的である。
byte[] ToBytes() {
var ms = new MemoryStream(somelength);
var bw = new BinaryWriter(ms);
bw.Write(SomeShort);
bw.Write(SomeOtherShort);
return ms.ToArray();
}
他のヒント
あなたは新しい配列にtmp
を初期化する必要はありません。 BitConverter.GetBytes
は、新しい配列を作成し、あなたのためにそれを返します。そこにはGetBytes
についてできることはあまりないのですが、あなたはのようなメソッドを使用することができますBuffer.BlockCopy
のコピー操作を簡素化する。
あなたは、コードのパフォーマンスが重要な作品でこれをやっていない場合、あなたは少しLINQyを行って、同じようなことを行うことができます:
IEnumerable<byte> bytes = BitConverter.GetBytes(first);
bytes = bytes.Concat(BitConverter.GetBytes(second));
bytes = bytes.Concat(BitConverter.GetBytes(third));
// ... so on; you can chain the calls too
return bytes.ToArray();
あなたは(値タイプのセットを持っている)事前にサイズを知っている場合は、
あなたは構造体を使用し、構造体に値を割り当てることができます。そして、生のバイトをコピーするunsafe
コードを使用しています。それはスピードのために本当に必要でない限り、私はまだそれに対して助言します。そして、あなたはそれが苦痛だと思うかもしれません。)
private struct MyStruct
{
public short A;
public short B;
public MyStruct(short a, short b)
{
A = a;
B = b;
}
}
private unsafe byte[] UnsafeStruct(MyStruct myStruct)
{
byte[] buffer = new byte[4]; // where 4 is the size of the struct
fixed (byte* ptr = buffer)
{
*((MyStruct*)ptr) = myStruct;
}
return buffer;
}
少しだけシフト...
buffer[0]=(byte)SomeShort;
buffer[1]=(byte)(SomeShort >> 8);
buffer[2]=(byte)SomeOtherShort;
buffer[3]=(byte)(SomeOtherShort >> 8);
これはまた、あなたがエンディアンを完全に制御していること(この場合は、リトルエンディアン)
所属していません StackOverflow