short型の配列をバイナリファイルから読み込む(C#)

C#でバイナリを読み込む機会がありましたので、メモ。
ターゲットフレームワークは .NET Core 2.1。
後述のように、より効率的な方法があるかもしれません。
パフォーマンス必要な方は、またお調べ下さい。

using System;
using System.IO;

namespace ShortFromBinary
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var f = File.OpenRead("input.dat"))
            using (var b = new BinaryReader(f))
            {
                var a = new short[f.Length / 2];
                for (int i = 0; i < a.Length; i++) { a[i] = b.ReadInt16(); }
                save("output.dat", a);
            }

            void save(String name, short[] arr)
            {
                using (var w = new BinaryWriter(
                               new FileStream(name, FileMode.Create)))
                {
                    foreach (var v in arr) { w.Write(v); }
                }
            }
        }
    }
}
コメント

10: 実行ディレクトリ(Debug\netcoreapp2.1 等)に input.dat がある想定。
13: input.dat は short型の数値を格納している前提。全byte ÷ short (2byte)。
14: ReadInt16 にて short で取得する。
15: 比較のために読み込んだ内容をそのまま output.dat に出力する。

補記

ファイルへの書き込みについては、MemoryMarshal の Cast による、より効率的な方法があるとの事(以下リンク)。しかし、議論されているように、わずかなパフォーマンスの向上のために、移植性また難読化のリスクを取るのはどうか。。。との事。

Efficiently writing an int array to file

メモリ上のコピー無しに int を byte に変更してそれを書いているみたい。
本記事のコードはパフォーマンスは最適化されてません。

カテゴリー: