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

uint8_t数组遇0x00数据被截断,使用memcpy无效如何解决?

问题根因

  • 初始的uint8_t* Buffer = temp_uint8_array;仅将指针指向原数组的首地址,没有执行任何内存复制操作,两个指针指向同一块内存空间。
  • 观测到的“数据截断”本质是误用了面向字符串的处理/打印函数(例如printf("%s")、strlen()等),这类函数以0x00作为终止标记,无法正确处理包含0x00的二进制数据,并非数据真的丢失。
  • memcpy调用无效的核心原因:
    1. 未提前为Buffer分配大小不小于local_length的独立内存空间,若Buffer仍指向原数组地址,memcpy等价于同一块内存的自复制,没有实际意义。
    2. 源地址参数写法不规范:数组名temp_uint8_array本身就是首地址,不需要额外加取址符&。

可行解决方案

步骤1:为Buffer分配独立内存

如果Buffer未提前分配空间,需要先申请足够的内存:

// 假设local_length已正确赋值为待复制的数组长度,示例中数组长度为6
size_t local_length = sizeof(temp_uint8_array) / sizeof(uint8_t);
uint8_t *Buffer = (uint8_t *)malloc(local_length * sizeof(uint8_t));
if (Buffer == NULL) {
    // 内存分配失败的异常处理逻辑
    perror("malloc failed");
    return;
}

如果Buffer是外部传入的已分配好的缓冲区,可跳过此步骤,仅需确保缓冲区大小≥local_length即可。

步骤2:执行正确的内存复制

memcpy(Buffer, temp_uint8_array, local_length);

步骤3:正确验证二进制数据

不要使用字符串类函数打印,按字节遍历输出即可看到完整数据:

for (size_t i = 0; i < local_length; i++) {
    printf("%02X ", Buffer[i]);
}
// 输出结果为:15 25 32 00 52 FD

注意事项

  • malloc申请的内存使用完成后,需要调用free(Buffer)释放,避免内存泄漏。
  • 如果是栈上分配Buffer,也可以直接定义固定长度的数组,比如uint8_t Buffer[6];,再执行memcpy操作。

内容的提问来源于stack exchange,提问作者Clément

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:39:05