将 C# 中的 byte[] 转换为 List<int>

6
我有一个列表,我正在将其转换为byte[],如下所示:
List<int> integerList = new List<int>();

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

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

如何将此转换回一个列表?
2个回答

17

其中一种方法是使用LINQ:

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

小更新:

如果您需要处理其他类型的问题,您还可以编写一个方便的通用版本:

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();
}

使用方法:

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

很好的答案。问题在于Nate尝试解析的int大小不一致为4个字节。 - M.Babcock
1
更新的答案:添加了通用版本,可适用于任何类型。 - max

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

编辑:如果您想要一个整数列表:

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

@Mellvar 不是 :). 我正在尝试将此列表放入 Azure 队列,它要求我将其作为 bytearray 放入(或字符串,但我不想这样做)。你最近的代码返回一个由 12 个整数组成的列表,其中每第四个整数是系列中的正确整数 (1,0,0,0,2,0,0,0,3,0,0,0)。 - Nate
@Nate:知道这点很好——否则做起来似乎非常低效: ) 如果你看到的就是这样,那么你的字节数组必须也是12个元素长的。 - Melllvar
@Nate:这是因为Int32是4个字节,而你正在使用小于16的值。 - M.Babcock
@M.Babcock 我的整数将是可变大小的。如果你有更大的整数,这个解决方案就不适用了。例如(3645465)。 - Nate
@Nate:你想解析的字节数组必须是可预测的。如果不是,那么这将是不可能的。 - M.Babcock
显示剩余7条评论

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