2009-07-09 73 views

答えて

14

一つの可能​​性はEnumerable.Selectを使用している:

byte[] bytes; 
var shorts = bytes.Select(b => (short)b).ToArray(); 

もう一つは、Array.ConvertAllを使用することである。

byte[] bytes; 
var shorts = Array.ConvertAll(bytes, b => (short)b); 
+0

オリジナルの提案(後で2番目のものを追加する前)はむしろ非効率的です –

+1

別のオプションはbytes.Cast ().ToArray()です。 –

+0

実際には、この結果、InvalidCastExceptionが発生します。簡単な説明は、このコードがボックス化されたバイトを暗黙的にunboxingして、有効なunboxing操作ではないshortにすることです。詳細については、http://stackoverflow.com/questions/445471/puzzling-enumerable-cast-invalidcastexceptionを参照してください。 – jason

0
short[] wordArray = Array.ConvertAll(byteArray, (b) => (short)b); 
-2
byte[] bytes; 
var shorts = bytes.Select(n => System.Convert.ToInt16(n)).ToArray(); 
+0

これは非常に非効率です。すべての要素に対してconvert.ToInt16()を呼び出し、一時的なリストに格納して新しい配列にコピーします。 –

+0

はい、それは非効率的です。私はそれが安全だと思っています。 –

+0

キャスティングより安全ですか? byte to shortのキャストは常に機能します。それは例外を投げることはできません –

2

shorthardは、2バイトの化合物です。あなたがショートパンツとしてファイルにすべてのショートパンツを書いているなら、それらの変換は間違っています。

short s = (short)(bytes[0] | (bytes[1] << 8)) 
+0

これは動作しません。 short s =(short)((bytes [0] << 8)| bytes [1]);このようにして、動作させる必要があります。 – DaveN59

+3

リトルエンディアンを仮定すると、これは次のようになります。short s =(short)(bytes [0] | bytes [1] << 8)) – Indy9000

2
short value = BitConverter.ToInt16(bytes, index); 
48

使用Buffer.BlockCopy:あなたはのようなものを使用して、真のshort値を取得するために2つのバイトを使用する必要があります。

バイト配列の半分の大きさで短い配列を作成し、中にバイトデータをコピーします。それははるかに最速の方法です

short[] sdata = new short[(int)Math.Ceiling(data.Length/2)]; 
Buffer.BlockCopy(data, 0, sdata, 0, data.Length); 

+1

解決策は私には当てはまりませんが、 – DaMachk

0

私は知らないが、私はこの質問に別のaproachを期待していただろう。 ショートパンツのシーケンスにバイトのシーケンスを変換する場合、私は@Peterは、ファイル内のバイトのエンディアンに依存

short s = (short)(bytes[0] | (bytes[1] << 8)) 

または

short s = (short)((bytes[0] << 8) | bytes[1]) 

を行ったようにそれが行われています。

しかし、OPには、彼のファイルの短所や短所の定義が使われていませんでした。 彼の場合、バイト配列を短い配列に変換するのは意味がありません。なぜなら、それは2倍のメモリを必要とするからです。そして、他の場所で使用されたときにshortに変換する必要があるかどうかわかりません。

関連する問題