如何将bool*类型位数组转换为unsigned char*类型字节数组
bool位数组转unsigned char字节数组实现方案
因为你已经提前保证位数组长度是8的整数倍,不需要处理余数补位逻辑,直接按每8位一组逐位拼接即可,具体实现如下:
核心实现逻辑
- 先按总位数计算需要的字节总数:
总字节数 = 位数组总长度 / 8 - 逐字节遍历,每个字节对应位数组中连续8个元素
- 根据需要的位序(高位在前/低位在前),把每个bit值移位拼接到字节变量中
- 把拼接完成的字节写入字节数组的对应位置,支持自定义起始存储索引(比如你要求前8位存入
byteArray[1],直接设置起始偏移为1即可)
可直接复用的C语言实现代码
#include <stdbool.h> /** * @brief 存储0/1值的bool位数组转字节数组 * @param bitArray 输入的位数组指针,元素值只能是0或1 * @param bitLen 位数组总长度,必须是8的整数倍 * @param byteArray 输出字节数组指针,需提前分配足够内存 * @param isMsbFirst 位序配置:true表示bitArray[0]对应字节最高位(通用场景默认选这个),false表示对应最低位 * @param byteStartIdx 字节数组起始存储下标,要从byteArray[1]开始存就传1 */ void bitArrToByteArr(const bool* bitArray, int bitLen, unsigned char* byteArray, bool isMsbFirst, int byteStartIdx) { int totalBytes = bitLen / 8; for (int i = 0; i < totalBytes; i++) { unsigned char curByte = 0; for (int j = 0; j < 8; j++) { int globalBitPos = i * 8 + j; unsigned char bitVal = bitArray[globalBitPos] ? 1 : 0; if (isMsbFirst) { // 高位在前:第0位对应字节的128位(2^7),第7位对应1位(2^0) curByte |= bitVal << (7 - j); } else { // 低位在前:第0位对应字节的1位(2^0),第7位对应128位(2^7) curByte |= bitVal << j; } } byteArray[byteStartIdx + i] = curByte; } }
调用示例
比如你需要把长度为16的位数组,从byteArray[1]的位置开始按高位在前存储,调用方式如下:
// 提前给byteArray分配足够内存,因为从下标1开始存2个字节,总长度至少为3 unsigned char* byteArray = (unsigned char*)malloc(3 * sizeof(unsigned char)); // 调用转换函数,16位长度,高位在前,从下标1开始存 bitArrToByteArr(bitArray, 16, byteArray, true, 1);
注意事项
- 调用函数前必须给
byteArray分配足够内存,如果你设置了非0的起始下标,总分配长度要算上偏移量,避免内存越界 - 位序根据你的实际业务场景选择即可,普通文件、网络协议场景默认用高位在前,对接部分串口、硬件外设时可能需要低位在前
- 因为你已经提前补好了末尾填充位,函数内不需要做长度校验、余数补位的额外处理
内容的提问来源于stack exchange,提问作者Kun Kang
相关产品推荐
相关产品推荐

