如何在C语言中将unsigned char数组字节拼接并转移到char数组
问题解决说明
核心转换规则:unsigned char转char的方法
C语言中unsigned char转char直接做显式强制类型转换即可,语法为(char)unsigned_char_value。如果你的字节值范围在0~127之间,转换前后的实际值完全一致;如果超过127,因char默认可能为有符号类型,会触发有符号数溢出,属于实现定义行为,若要保留原始数值建议直接用unsigned char数组存储拼接结果。
现有方案的错误点
- 你尝试的
strcmp、strcat都是C标准库的字符串处理函数,要求入参必须是带'\0'结束符的合法C字符串,你存储的是原始字节值,不符合函数入参要求,不能直接使用 - 循环条件写了
i <= 10,你定义的两个数组长度都是10,合法下标仅为0~9,i=10时会越界访问内存,属于未定义行为 text_concat数组没有预留'\0'结束符的存储空间,直接用%s打印时,printf会一直读取内存直到遇到随机的'\0',会输出乱码甚至程序崩溃- 你示例中的字节值0x01~0x10都是ASCII控制字符,本身是不可打印的,直接打印不会在终端显示可见内容,如果你需要将字节值转为可见的十六进制/十进制字符,需要额外做转换逻辑。
可运行的实现代码
场景1:直接拷贝原始字节值,按字节打印查看
如果你就是需要保留原始字节值,可通过指定打印长度的方式输出,不需要依赖'\0'结束符:
#include <stdio.h> int main() { unsigned char byte_loop[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10}; // 多留1位放结束符,数组初始化为0避免垃圾值 char text_concat[11] = {0}; for (int i = 0; i < 10; i++) { // unsigned char转char直接强转即可 text_concat[i] = (char)byte_loop[i]; // 用%.*s指定打印长度避免越界,同时输出十六进制值方便校验 printf("第%d次拼接结果: 字符串=[%.*s] 当前字节十六进制=0x%02hhx\n", i+1, i+1, text_concat, byte_loop[i]); } return 0; }
场景2:将字节值转为可见十六进制字符拼接
如果你需要在终端看到每个字节对应的可读十六进制值,可按如下方式实现:
#include <stdio.h> int main() { unsigned char byte_loop[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10}; // 每个字节转2个十六进制字符,多留1位放结束符 char text_concat[21] = {0}; const char hex_table[] = "0123456789abcdef"; for (int i = 0; i < 10; i++) { // 拆分高4位和低4位转成十六进制字符 text_concat[i*2] = hex_table[byte_loop[i] >> 4]; text_concat[i*2 + 1] = hex_table[byte_loop[i] & 0x0f]; // 实时打印拼接结果 printf("第%d次拼接结果: %s\n", i+1, text_concat); } return 0; }
内容的提问来源于stack exchange,提问作者Gilliard Santos
相关产品推荐
相关产品推荐

