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 に変更してそれを書いているみたい。
本記事のコードはパフォーマンスは最適化されてません。