在C#中如何实现ToCollection反向操作:List<int>转byte数组?
实现ToCollection方法的反向操作:List转byte[]
原ToCollection方法的逻辑是把byte数组的每个字节按位拆解,每一位对应一个整数(字节索引×8 + 位偏移)——如果字节的某一位是1,就返回对应的整数。要实现反向操作,我们需要把List
反向实现代码
public static byte[] ToBitfield(IEnumerable<int> collection) { if (collection == null) throw new ArgumentNullException(nameof(collection)); var numberList = collection.ToList(); if (numberList.Count == 0) return Array.Empty<byte>(); int maxNum = numberList.Max(); int byteLength = (maxNum / 8) + 1; byte[] bitfield = new byte[byteLength]; foreach (int num in numberList) { if (num < 0) throw new ArgumentOutOfRangeException(nameof(collection), "集合中的整数不能为负数"); int byteIndex = num / 8; int bitPosition = num % 8; byte bitMask = (byte)(1 << bitPosition); bitfield[byteIndex] |= bitMask; } return bitfield; }
代码逻辑说明
- 边界处理:先判断输入是否为空,空集合直接返回空byte数组,避免后续计算出错。
- 确定字节长度:找到集合中的最大整数,计算需要的字节数——因为每个字节对应8个整数(比如0-7对应第0个字节,8-15对应第1个字节),所以最大数除以8取整后加1就是所需的字节总数。
- 位映射:遍历每个整数:
- 用
num / 8计算该整数对应的字节索引 - 用
num % 8计算该整数在字节中的位位置(0到7) - 生成对应位的掩码(1左移对应位的位置),通过按位或操作将该字节的对应位设为1
- 用
- 返回结果:最终生成的byte数组就是原方法的反向结果。
验证示例
比如原byte数组是new byte[] { 0b10100001 },通过ToCollection会返回0, 4, 7;将[0,4,7]传入ToBitfield,得到的byte数组就是0b10100001,和原数组一致。
内容的提问来源于stack exchange,提问作者Cef
相关产品推荐
相关产品推荐

