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

如何在C#中实现ToCollection方法逆过程:从List<int>生成字节数组?

原方法逻辑解析

原ToCollection方法是把字节数组当作位掩码集合来处理,逻辑非常直白:

  • 数组中第ix个字节,对应覆盖整数范围 [ix*8, ix*8+7]
  • 字节的每一位(从最低位到最高位,对应十六进制0x01到0x80)代表对应位置的整数是否存在:如果某bit为1,就把对应的整数加入结果集合

举个例子:

  • 第0个字节的0x02位为1 → 生成整数0*8+1=1
  • 第0个字节的0x04位为1 → 生成整数0*8+2=2
逆过程实现(整数集合转字节数组)

要实现逆转换,核心是把每个整数映射回对应的字节索引和bit位,再将对应bit置1:

public static byte[] ToBitfield(IEnumerable<int> collection)
{
    if (collection == null || !collection.Any())
        return Array.Empty<byte>();

    // 根据最大整数确定需要的字节数(每个字节覆盖8个连续整数)
    int maxNum = collection.Max();
    int byteCount = (maxNum / 8) + 1;
    byte[] bitfield = new byte[byteCount];

    foreach (int num in collection)
    {
        // 计算该整数对应的字节索引
        int byteIndex = num / 8;
        // 计算该整数对应的bit位置
        int bitPosition = num % 8;
        // 将对应bit置为1
        bitfield[byteIndex] |= (byte)(1 << bitPosition);
    }

    return bitfield;
}
示例验证
  1. 原Base64字符串 "EjCAZQM=" 解码为字节数组:[0x11, 0x08, 0x06, 0x40, 0x03]
  2. 经ToCollection转换后得到集合:{0,1,2,4,8,18,24}
  3. 添加整数5后,集合变为{0,1,2,4,5,8,18,24}
  4. 用ToBitfield转换为字节数组:[0x37, 0x08, 0x06, 0x40, 0x03]
  5. 再编码为Base64:EjcCAZQM=

内容的提问来源于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:18