Ich lese gerade eine Datei und wollte in der Lage sein, das Array von Bytes aus der Datei in ein kurzes Array zu konvertieren.Konvertieren von Byte-Array in kurze Array in C#
Wie würde ich das machen?
Ich lese gerade eine Datei und wollte in der Lage sein, das Array von Bytes aus der Datei in ein kurzes Array zu konvertieren.Konvertieren von Byte-Array in kurze Array in C#
Wie würde ich das machen?
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);
Ihr ursprünglicher Vorschlag (bevor Sie den zweiten später hinzugefügt haben) ist ziemlich ineffizient –
Eine andere Option wäre Bytes.Cast
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
short[] wordArray = Array.ConvertAll(byteArray, (b) => (short)b);
byte[] bytes;
var shorts = bytes.Select(n => System.Convert.ToInt16(n)).ToArray();
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. –
Ja, es ist ineffizient. Ich denke, dass es sicherer ist, dann Casting. –
Sicherer als Gießen? Ein Cast von Byte zu Short funktioniert immer. Es kann niemals eine Ausnahme auslösen –
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))
short value = BitConverter.ToInt16(bytes, index);
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.
Die Lösung, die ich nicht verdiene, aber die, die ich gerade brauche! – DaMachk
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.
Möchten Sie 1 Byte in 1 Short oder 2 Byte in 1 Short konvertieren? – maxwellb