如何简便合并多个BitArray并转换为48字节byte[]用于UDP传输?
合并多个BitArray为48字节byte[]的简便实现
核心思路
先确保所有BitArray的总位数刚好是384位(对应48字节),再将各个BitArray的位按顺序合并到一个总长度为384的BitArray中,最后把合并后的BitArray转换为byte[]即可。
实现方案一:高效直接的位复制
这种方法通过手动控制偏移量逐个复制位,性能稳定、逻辑清晰:
// 初始化各个BitArray(示例) BitArray a1 = new BitArray(3); BitArray a2 = new BitArray(11); BitArray a3 = new BitArray(14); // ...其他需要合并的BitArray // 计算总位数,校验是否符合48字节要求 int totalBits = a1.Count + a2.Count + a3.Count; // 需包含所有要合并的BitArray if (totalBits != 48 * 8) { throw new InvalidOperationException("所有BitArray的总位数必须为384位(48字节)"); } // 创建用于合并的目标BitArray BitArray combinedBitArray = new BitArray(384); int currentOffset = 0; // 逐个复制每个BitArray的位到目标数组 CopyBits(a1, combinedBitArray, ref currentOffset); CopyBits(a2, combinedBitArray, ref currentOffset); CopyBits(a3, combinedBitArray, ref currentOffset); // 继续复制后续的BitArray... // 转换为最终的byte[] byte[] result = new byte[48]; combinedBitArray.CopyTo(result, 0); // 辅助复制方法 void CopyBits(BitArray source, BitArray target, ref int offset) { for (int i = 0; i < source.Count; i++) { target[offset + i] = source[i]; } offset += source.Count; }
实现方案二:简洁的LINQ拼接
如果不追求极致性能,用LINQ可以写出更简洁的代码,适合快速实现:
// 初始化各个BitArray BitArray a1 = new BitArray(3); BitArray a2 = new BitArray(11); BitArray a3 = new BitArray(14); // ...其他需要合并的BitArray // 拼接所有BitArray的位 var allBits = a1.Cast<bool>() .Concat(a2.Cast<bool>()) .Concat(a3.Cast<bool>()) // 追加其他BitArray的Cast<bool>() .ToArray(); // 校验总位数 if (allBits.Length != 48 * 8) { throw new InvalidOperationException("总位数必须为384位"); } // 转换为byte[] BitArray combinedBitArray = new BitArray(allBits); byte[] result = new byte[48]; combinedBitArray.CopyTo(result, 0);
注意事项
- 必须保证所有BitArray的总位数恰好是384位,否则转换后的byte[]长度会不符合要求,若需要补位需额外处理逻辑。
BitArray.CopyTo方法会自动处理字节对齐,无需手动调整。
内容的提问来源于stack exchange,提问作者Azriel H
相关产品推荐
相关产品推荐

