2009-07-09 12 views

Antwort

14

Eine Möglichkeit verwendet Enumerable.Select:

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

Ein weiterer Grund ist Array.ConvertAll zu verwenden:

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

Ihr ursprünglicher Vorschlag (bevor Sie den zweiten später hinzugefügt haben) ist ziemlich ineffizient –

+1

Eine andere Option wäre Bytes.Cast (). ToArray(); –

+0

Tatsächlich führt dies zu einer InvalidCastException. Die kurze Erklärung ist, dass dieser Code implizit dazu führt, dass ein Boxed-Byte zu einem kurzen Wert entpackt wird, was keine gültige Unboxing-Operation ist. Weitere Informationen finden Sie unter 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

Das ist extrem ineffizient: Aufruf von convert.ToInt16() für jedes Element, Speichern in einer temporären Liste und anschließendes Kopieren in ein neues Array. –

+0

Ja, es ist ineffizient. Ich denke, dass es sicherer ist, dann Casting. –

+0

Sicherer als Gießen? Ein Cast von Byte zu Short funktioniert immer. Es kann niemals eine Ausnahme auslösen –

2

shorthard A ist eine Verbindung von zwei Bytes. Wenn Sie alle Shorts in der Datei als echte Shorts schreiben, sind diese Konvertierungen falsch. Sie müssen zwei Bytes verwenden, um den wahren kurzen Wert zu erhalten, mit so etwas wie:

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

Dies funktioniert nicht.Sie müssen es so machen, damit es funktioniert: short s = (kurz) ((bytes [0] << 8) | bytes [1]); – DaveN59

+3

Angenommen, Little Endian, sollte dies sein: kurz s = (kurz) (Bytes [0] | (Bytes [1] << 8)) – Indy9000

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

Verwendung Buffer.BlockCopy.

Erstellen Sie die kurze Array mit der halben Größe des Byte-Arrays, und kopieren Sie die Byte-Daten in:

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

Es ist die schnellste Methode ist bei weitem.

+1

Die Lösung, die ich nicht verdiene, aber die, die ich gerade brauche! – DaMachk

0

Ich weiß nicht, aber ich hätte einen anderen Ansatz zu dieser Frage erwartet. Wenn eine Folge von Bytes in eine Folge von kurzen Hosen Umwandlung, ich mag es @ Peter getan hätte taten

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

oder

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

je nach Endianess des Bytes in der Datei.

Aber der OP erwähnte seine Verwendung der Shorts oder die Definition der Shorts in der Datei nicht. In diesem Fall würde es keinen Sinn machen, das Byte-Array in ein kurzes Array umzuwandeln, weil es doppelt so viel Speicher beanspruchen würde, und ich bezweifle, dass ein Byte bei Verwendung an anderer Stelle in einen Short konvertiert werden müsste.

Verwandte Themen