Преобразование списка int в массив байтов
Я попытался использовать метод List.ConvertAll и не удалось. То, что я пытаюсь сделать, это преобразовать List<Int32>
в byte[]
Я выскочил и пошел по этому маршруту, но мне нужно выяснить метод ConvertAll...
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();
}
Ответы
Ответ 1
Поскольку вы не хотите byte[][]
, где каждое целое число сопоставляется с массивом из четырех байтов, вы не можете вызвать ConvertAll
. (ConvertAll
не может выполнить преобразование "один ко многим" )
Вместо этого вам нужно вызвать метод LINQ SelectMany
, чтобы свести каждый массив байтов от GetBytes
в один byte[]
:
integers.SelectMany(BitConverter.GetBytes).ToArray()
Ответ 2
Как насчет
var bytes = integers.Select(i => BitConverter.GetBytes(i)).ToArray();
полностью непроверенный BTW, но кажется разумным.
Это должно фактически дать вам массив массивов байтов... что может быть или не быть тем, что вам нужно. Если вы хотите свернуть его в один массив, вы можете использовать SelectMany
var bytes = integers.SelectMany(i => BitConverter.GetBytes(i)).ToArray();
Ответ 3
Метод ConvertAll ошибочен, потому что он ожидает, что будет отображаться 1:1 от источника до адресата. Это неверно при преобразовании целых чисел в байты. Вам гораздо лучше идти с таким решением, как то, что предложил @SLaks с помощью метода расширения SelectMany.
Ответ 4
Чтобы использовать метод ConvertAll, вы можете сделать следующее...
Предполагая, что у вас есть список int, которые действительно байтовые значения, и вы фактически не хотите, чтобы байты, необходимые для создания 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();