3

私は次のコードを得ました:

    byte[] myBytes = new byte[10 * 10000];
    for (long i = 0; i < 10000; i++)
    {
        byte[] a1 = BitConverter.GetBytes(i);
        byte[] a2 = BitConverter.GetBytes(true);
        byte[] a3 = BitConverter.GetBytes(false);

        byte[] rv = new byte[10];
        System.Buffer.BlockCopy(a1, 0, rv, 0, a1.Length);
        System.Buffer.BlockCopy(a2, 0, rv, a1.Length, a2.Length);
        System.Buffer.BlockCopy(a3, 0, rv, a1.Length + a2.Length, a3.Length);
    }

すべてが正常に機能します。すべてが書き込まれるようにこのコードを変換しようとしていましmyBytesたが、長い値を使用していて、その値が高くなるとint.MaxValueキャストが失敗することに気付きました。どうすればこれを解決できますか?

別の質問は、メモリ内に非常に大きなバイト配列を作成したくないので、.WriteBytes(path, myBytes);関数に直接送信するにはどうすればよいですか?

4

2 に答える 2

2

提案されているように、これの最終的な宛先がファイルである場合: メモリにバッファリングするのではなく、より直接的にファイルに書き込みます。

using (var file = File.Create(path)) // or append file FileStream etc
using (var writer = new BinaryWriter(file))
{
    for (long i = 0; i < 10000; i++)
    {
        writer.Write(i);
        writer.Write(true);
        writer.Write(false);
    }
}

おそらく、あなたのケースでこれを行う理想的な方法は、オブジェクトをシリアル化するときに、各オブジェクトに単一のBinaryWriterインスタンスを順番に渡すことです (オブジェクトごとにファイルを開いたり閉じたりしないでください)。

于 2012-10-12T12:09:31.830 に答える
1

大規模なバッファに変換するのではなく、処理中にバイトをWrite()するだけでなく、少なくとも小さなバッファを使用しないのはなぜですか?

于 2012-10-12T11:56:37.197 に答える