You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C#中如何实现ToCollection反向操作:List<int>转byte数组?

实现ToCollection方法的反向操作:List转byte[]

原ToCollection方法的逻辑是把byte数组的每个字节按位拆解,每一位对应一个整数(字节索引×8 + 位偏移)——如果字节的某一位是1,就返回对应的整数。要实现反向操作,我们需要把List里的每个整数映射回对应的字节位,将该位设为1。

反向实现代码

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

代码逻辑说明

  1. 边界处理:先判断输入是否为空,空集合直接返回空byte数组,避免后续计算出错。
  2. 确定字节长度:找到集合中的最大整数,计算需要的字节数——因为每个字节对应8个整数(比如0-7对应第0个字节,8-15对应第1个字节),所以最大数除以8取整后加1就是所需的字节总数。
  3. 位映射:遍历每个整数:
    • 用num / 8计算该整数对应的字节索引
    • 用num % 8计算该整数在字节中的位位置(0到7)
    • 生成对应位的掩码(1左移对应位的位置),通过按位或操作将该字节的对应位设为1
  4. 返回结果:最终生成的byte数组就是原方法的反向结果。

验证示例

比如原byte数组是new byte[] { 0b10100001 },通过ToCollection会返回0, 4, 7;将[0,4,7]传入ToBitfield,得到的byte数组就是0b10100001,和原数组一致。

内容的提问来源于stack exchange,提问作者Cef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:45:34