13 Stimmen

Umwandlung einer Liste von Ints in ein Byte-Array

Ich habe versucht, die List.ConvertAll Methode und schlug fehl. Was ich zu tun versuche, ist die Konvertierung einer List<Int32> a byte[]

Ich bin ausgewichen und habe diesen Weg gewählt, aber ich muss die ConvertAll-Methode herausfinden...

List<Int32> integers...

internal byte[] GetBytes()
{
    List<byte> bytes = new List<byte>(integers.Count * sizeof(byte));
    foreach (Int32 integer in integers)
        bytes.AddRange(BitConverter.GetBytes(integer));

    return bytes.ToArray();
}

17voto

SLaks Punkte 832502

Da Sie nicht wollen, dass ein byte[][] wo jede ganze Zahl einem Array von vier Bytes entspricht, können Sie nicht ConvertAll . ( ConvertAll keine Eins-zu-Viel-Konvertierung durchführen kann)

Stattdessen müssen Sie die LINQ SelectMany Methode, um jedes Byte-Array von GetBytes zu einem einzigen byte[] :

integers.SelectMany(BitConverter.GetBytes).ToArray()

3voto

ckramer Punkte 9351

Wie wäre es mit

var bytes = integers.Select(i => BitConverter.GetBytes(i)).ToArray();

Das ist übrigens völlig ungetestet, scheint aber vernünftig zu sein.

Dies sollte Ihnen eigentlich ein Array von Arrays von Bytes geben... was vielleicht nicht das ist, was Sie brauchen. Wenn Sie es zu einem einzigen Array zusammenfassen wollen, können Sie SelectMany

var bytes = integers.SelectMany(i => BitConverter.GetBytes(i)).ToArray();

2voto

Harry Steinhilber Punkte 5099

Die Methode ConvertAll ist fehlerhaft, weil sie eine 1:1-Zuordnung von der Quelle zum Ziel erwartet. Dies ist bei der Umwandlung von Ganzzahlen in Bytes nicht der Fall. Sie sind viel besser dran, wenn Sie eine Lösung wählen, wie sie @SLaks mit der Erweiterungsmethode SelectMany vorgeschlagen hat.

1voto

Adrian Regan Punkte 2240

Um die ConvertAll-Methode zu verwenden, können Sie wie folgt vorgehen...

Angenommen, Sie haben eine Liste von Ints, die in Wirklichkeit Byte-Werte sind, und Sie wollen die Bytes, die zur Bildung eines Ints erforderlich sind, nicht wirklich haben, d. h. byte[][] :

public static class Utility {

   public static byte IntToByte(int i) {
       if(i < 0)
           return (byte)0;
       else if(i > 255)
           return (byte)255;
       else
           return System.Convert.ToByte(i);
   }
}

... zu konvertieren ...

byte[] array = listOfInts.ConvertAll(
                    new Converter<byte, int>(Utility.IntToByte) ).ToArray();

oder Sie könnten einen anonymen Delegierten verwenden...

byte[] array = listOfInts.ConvertAll( new Converter<byte, int>(
                   delegate(int i) {
                       if(i < 0)
                          return (byte)0;
                       else if(i > 255)
                          return (byte)255;
                       else
                          return System.Convert.ToByte(i);
                   })).ToArray();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X