私は現在ファイルを読んでいて、ファイルから取得したバイト配列を短い配列に変換できるようにしたいと考えていました。
どうすればこれを行うことができますか?
Buffer.BlockCopyを使用します。
バイト配列の半分のサイズで短い配列を作成し、バイトデータを次の場所にコピーします。
short[] sdata = new short[(int)Math.Ceiling(data.Length / 2)];
Buffer.BlockCopy(data, 0, sdata, 0, data.Length);
これは断然最速の方法です。
1つの可能性は次を使用していEnumerable.Select
ます:
byte[] bytes;
var shorts = bytes.Select(b => (short)b).ToArray();
もう1つは使用することArray.ConvertAll
です:
byte[] bytes;
var shorts = Array.ConvertAll(bytes, b => (short)b);
ショートハードは 2 バイトの複合です。すべての short を真の short としてファイルに書き込んでいる場合、それらの変換は間違っています。次のようなものを使用して、真の short 値を取得するには 2 バイトを使用する必要があります。
short s = (short)(bytes[0] | (bytes[1] << 8))
short value = BitConverter.ToInt16(bytes, index);
わかりませんが、この質問に対する別のアプローチを期待していたでしょう。一連のバイトを一連の short に変換するとき、@Peter のように実行します
short s = (short)(bytes[0] | (bytes[1] << 8))
また
short s = (short)((bytes[0] << 8) | bytes[1])
ファイル内のバイトのエンディアンに応じて。
しかし、OPは、ショートパンツの使用法やファイル内のショートパンツの定義について言及していませんでした. 彼の場合、バイト配列を short 配列に変換しても意味がありません。2 倍のメモリが必要になるためです。他の場所で使用するときにバイトを short に変換する必要があるかどうかは疑問です。
short[] wordArray = Array.ConvertAll(byteArray, (b) => (short)b);
byte[] bytes;
var shorts = bytes.Select(n => System.Convert.ToInt16(n)).ToArray();