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

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:45:01