2011-12-17 12 views
5

Mam listę, że jestem konwersji do byte [] tak:C# byte [] powrót do listy <int>

List<int> integerList = new List<int>(); 

integerList.Add(1); 
integerList.Add(2); 
integerList.Add(3); 

byte[] bytes = integerList.SelectMany(BitConverter.GetBytes).ToArray(); 

Jak przekonwertować to z powrotem do listy?

Odpowiedz

15

jeden z wielu sposobów, aby to zrobić (LINQ jeden):

var originalList = Enumerable.Range(0, bytes.Length/4) 
          .Select(i => BitConverter.ToInt32(bytes, i * 4)) 
          .ToList(); 

Minor aktualizacja:

Możesz również napisać podręczną wersję generyczną tego (na wszelki wypadek, gdy będziesz musiał k z innych typów):

static List<T> ToListOf<T>(byte[] array, Func<byte[], int, T> bitConverter) 
{ 
    var size = Marshal.SizeOf(typeof(T)); 
    return Enumerable.Range(0, array.Length/size) 
        .Select(i => bitConverter(array, i * size)) 
        .ToList(); 
} 

Zastosowanie:

var originalList = ToListOf<int>(bytes, BitConverter.ToInt32); 
+0

Świetna odpowiedź. Problem polega na tym, że rozmiar int, który próbuje Nate, nie jest spójny 4 bajtami. –

+1

Zaktualizowana odpowiedź: dodano wersję ogólną, która będzie działać z każdym typem – max

+0

Bravo. Zrobiłbym ci powtórkę, gdybym mógł. –

1
byte[] is an IEnumerable; LINQ's ToList() extension method should do it. 

EDIT: Jeśli chcesz listę int to:

bytes.Select((b) => (int)b).toList(); 
+0

To by produkować listę bajtów, prawda? –

+0

Tak; czy nie o to pytasz? – Melllvar

+0

Tak, to właśnie tworzy listę bajtów, po prostu ją przetestowałem. – Nate