如何在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; }
示例验证
- 原Base64字符串
"EjCAZQM="解码为字节数组:[0x11, 0x08, 0x06, 0x40, 0x03] - 经
ToCollection转换后得到集合:{0,1,2,4,8,18,24} - 添加整数5后,集合变为
{0,1,2,4,5,8,18,24} - 用
ToBitfield转换为字节数组:[0x37, 0x08, 0x06, 0x40, 0x03] - 再编码为Base64:
EjcCAZQM=
内容的提问来源于stack exchange,提问作者Cef
相关产品推荐
相关产品推荐

