Преобразование списка ints к массиву байтов

Я пытался использовать Список. Метод ConvertAll и отказавший. То, что я пытаюсь сделать, является преобразованием a List кому: byte[]

Я схватил и пошел этим путем, но я должен выяснить метод ConvertAll...

List integers...

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

    return bytes.ToArray();
}

11
задан Peter Mortensen 1 July 2016 в 10:26
поделиться

4 ответа

Поскольку вам не нужен байт [] [] , где каждое целое число отображается в массив из четырех байтов, вы не можете вызвать ConvertAll . ( ConvertAll не может выполнить преобразование «один ко многим»)

Вместо этого вам нужно вызвать метод LINQ SelectMany , чтобы сгладить каждый массив байтов из GetBytes в один байт [] :

integers.SelectMany(BitConverter.GetBytes).ToArray()
16
ответ дан 3 December 2019 в 05:11
поделиться

Как насчет

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

полностью непроверенного, кстати, но кажется разумным.

Это должно фактически дать вам массив массивов байтов ... который может быть или не быть тем, что вам нужно. Если вы хотите свернуть его в один массив, вы можете использовать SelectMany

var bytes = integers.SelectMany(i => BitConverter.GetBytes(i)).ToArray();
3
ответ дан 3 December 2019 в 05:11
поделиться

Метод ConvertAll ошибочен, поскольку он ожидает отображения 1: 1 от источника к месту назначения. Это неверно при преобразовании целых чисел в байты. Вам будет гораздо лучше пойти с решением, подобным тому, что предлагает @SLaks с методом расширения SelectMany.

2
ответ дан 3 December 2019 в 05:11
поделиться

Чтобы использовать метод ConvertAll, вы можете сделать следующее...

Предполагая, что у вас есть список байтов, которые на самом деле являются байтами, и вы не хотите, чтобы байты, необходимые для создания int, т.е. 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);
   }
}

... преобразовывались...

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

или вы можете использовать анонимный делегат ...

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();
1
ответ дан 3 December 2019 в 05:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: