2016-01-19 4 views
1

Как сменить list<int[]> на byte[]?Конвертировать список <int[]> в байт []

Я мог бы использовать это:

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

Но это работает только для list<int>. Если у вас мало идей - наиболее эффективный прием приветствуется.

+1

Что ожидаемое поведение, если один из Интс находится вне диапазона байта? Например, 1,000,000. –

+0

Получил пример, какими могут быть данные ввода/вывода? – Caramiriel

+0

@MikeChristensen, пример, который дал OP, преобразует каждый 'int' в 4 байта. –

ответ

4

Как об этом:

byte[] bytes = 
    lista 
    .SelectMany(x => x) 
    .SelectMany(BitConverter.GetBytes) 
    .ToArray(); 

UPDATE:

Чтобы преобразовать результат в List<int>, вы можете сделать следующее:

List<int> list = 
    bytes 
     .Select((item, index) => new {item, index}) 
     .GroupBy(x => x.index/4) 
     .Select(g => g.Select(x => x.item).ToArray()) 
     .Select(x => BitConverter.ToInt32(x, 0)) 
     .ToList(); 
+1

Это должен быть принятый ответ. –

+1

@KKKk, я рад, что смогу помочь –

0
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(bos); 
oos.writeObject(list); 
byte[] bytes = bos.toByteArray(); 
+0

извините, я не упоминал, что мне нужен C# example – KKKk

1
 var listOfIntArray = new List<int[]> 
     { 
      new[] {1, 2, 3}, 
      new[] {4, 5}, 
      new[] {6} 
     }; 

     var listOfBytes = new List<byte>(); 

     foreach (var intArray in listOfIntArray) 
     { 
      var listOfByteArray = intArray.Select(BitConverter.GetBytes); 

      foreach (var byteArray in listOfByteArray) 
      { 
       listOfBytes.AddRange(byteArray); 
      } 
     } 
+0

Не могли бы вы отправить часть, когда вы ее тоже перевернете? Заранее спасибо – KKKk

+1

@KKKk, вы не можете преобразовать его обратно в «Список '. Только для 'List '. –

+0

Это кажется излишне подробным .. –

1

Если вы использовали BitConverter с целью вы можете использовать это (выведет на экран все 4 байта целое отдельно)

byte[] buffer = testData.SelectMany(arr => arr.SelectMany(x => BitConverter.GetBytes(x))).ToArray(); 

для полноты картины:

List<int> reversed = Enumerable.Range(0, buffer.Length/4) 
           .Select(x => BitConverter.ToInt32(buffer, x * 4)) 
           .ToList(); 

Как и в ответ Якуб Массад в это будет в List<int> вместо List<int[]>, потому что сначала сглаживаем List<int[]>, мы теряем информацию о длинах массивов.


Если вы хотите, чтобы бросить значения INT в байтах вы можете использовать этот

byte[] buffer = testData.SelectMany(arr => arr.Select(x => (byte)x)).ToArray(); 
1
var result = lista.SelectMany(x => x.SelectMany(y => BitConverter.GetBytes(y))).ToArray(); 
Смежные вопросы