4

私はプロジェクトで生のバイトを処理する必要があり、基本的にこのようなことをする必要があります

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];
}

これはとても間違っているように感じますが、それを行うためのより良い方法を見つけることができません。もっと簡単な方法はありますか?

4

5 に答える 5

6

BinaryWriterは非常に効率的です。

    byte[] ToBytes() {
        var ms = new MemoryStream(somelength);
        var bw = new BinaryWriter(ms);
        bw.Write(SomeShort);
        bw.Write(SomeOtherShort);
        return ms.ToArray();
    }
于 2010-03-26T22:28:49.620 に答える
3

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();
于 2010-03-26T22:02:13.830 に答える
1

ただビットシフト...

buffer[0]=(byte)SomeShort;
buffer[1]=(byte)(SomeShort >> 8);
buffer[2]=(byte)SomeOtherShort;
buffer[3]=(byte)(SomeOtherShort >> 8);

これは、エンディアン(この場合はリトルエンディアン)を完全に制御できることも意味します。

于 2010-03-26T23:57:36.940 に答える
1

サイズが事前にわかっている場合(値タイプのセットがある場合)、構造体を使用して、構造体に値を割り当てることができます。次に、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;
}
于 2010-03-26T23:03:03.107 に答える
0

Array.Copyを使用してコードを少し短くすることはできますが、バイトを直接バッファーに入れるGetBytesオーバーロードまたは同等の機能はBitConverterにはありません。

たぶん、 MemoryStream上のBinaryWriterはあなたが望むものですか?

気に入らないBitConverterのAPI規則を採用することにより、クラスのユーザーにも同じ問題が発生することに注意してください。代わりに、BinaryWriterを受け入れてクラスをシリアル化するメソッドを記述します。これは、クラスが他のオブジェクトに埋め込まれている場合にうまく拡張されます。

于 2010-03-26T22:00:01.013 に答える