将整数列表转换为字节数组

13

我尝试使用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();
}
4个回答

17

如果您不想要一个byte[][],其中每个整数映射到一个四字节数组,那么您不能调用ConvertAll。(ConvertAll无法执行一对多的转换)

相反,您需要调用LINQ的SelectMany方法,将GetBytes的每个字节数组展开为单个byte[]

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

OoOoO 我喜欢。至于 ConvertAll 返回一个 byte[][],那正是我遇到的问题,完全被难住了。谢谢! - MQS
1
对于那些还没有转移到Visual Studio 2010的人来说,语法是ints.SelectMany(i => BitConverter.GetBytes(i)).ToArray()。 - zonkflut
1
@zonkflut:或者integers.SelectMany<int, byte>(BitConverter.GetBytes).ToArray() - SLaks

3
如何呢?
var bytes = integers.Select(i => BitConverter.GetBytes(i)).ToArray();

完全未经测试,但似乎合理。

这实际上应该为您提供一个字节数组的数组......可能是您需要的,也可能不是。如果您想将其合并为单个数组,则可以使用 SelectMany

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

2

ConvertAll方法存在缺陷,因为它期望从源到目的地存在1:1的映射关系。但是,当将整数转换为字节时,这并不正确。更好的解决方案是采用@SLaks所建议的SelectMany扩展方法。


1
要使用ConvertAll方法,您可以按照以下步骤操作...
假设您有一个整数列表,这些整数实际上是字节值,并且您不想要组成整数所需的字节,即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
如果值大于byte.MaxValue,System.Convert.ToByte将抛出OverflowException异常。 - Harry Steinhilber
如果为True,则验证整数并在超过255或小于0时进行限制。我认为这个问题是在问如何使用ConvertAll... - Adrian Regan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接