ARM架构下C语言中合并存储十六进制值的字符变量实现方案问询
ARM架构下C语言合并多个unsigned char数组的实现方案
Hey,这个需求其实挺直观的——就是把几个unsigned char数组按part1 -> flag -> part2的顺序拼接成一个新数组对吧?ARM架构下的实现逻辑和x86没啥本质区别,核心就是搞定长度计算、内存分配和字节拷贝这几步,我给你详细说下:
1. 先计算每个数组的有效长度
因为你要合并的是存储十六进制值的字符数组(不是以\0结尾的字符串),所以直接用sizeof运算符计算数组的总字节数就行。需要注意的是:
- 如果数组定义在其他C文件里,要在当前文件用
extern声明才能访问; - 如果数组是函数参数传递过来的,数组名会退化为指针,这时候需要单独传入长度参数(不过你的例子里都是全局/外部数组,所以直接用
sizeof没问题)。
比如:
// 假设这些数组来自其他文件,用extern声明 extern unsigned char part1[]; extern unsigned char part2[]; extern unsigned char flag[2]; // 计算各数组长度 size_t len_part1 = sizeof(part1) / sizeof(part1[0]); size_t len_flag = sizeof(flag) / sizeof(flag[0]); // 这里flag长度固定是2,也可以直接写2 size_t len_part2 = sizeof(part2) / sizeof(part2[0]); size_t total_len = len_part1 + len_flag + len_part2;
2. 分配目标数组的内存
有两种常见方式,根据你的场景选:
- 静态分配:如果总长度固定且不大,直接定义一个足够大的静态数组,简单高效,不需要手动释放内存;
- 动态分配:如果长度不确定或者比较大,用
malloc动态申请内存,更灵活,但用完要记得free避免内存泄漏。
3. 用memcpy逐个拷贝内容
memcpy是标准库函数,字节级别的拷贝,完美适配这种数组拼接需求,而且在ARM架构下的编译器(比如GCC、Clang)都会做优化,不用担心性能问题。
完整代码示例
#include <string.h> #include <stdlib.h> #include <stdio.h> // 外部数组声明(模拟来自其他C文件) extern unsigned char part1[]; extern unsigned char part2[]; extern unsigned char flag[2]; // 为了测试,这里定义一下外部数组(实际项目中放在其他文件) unsigned char part1[] = {0x40, 0x34, 0x12}; unsigned char part2[] = {0x01, 0x40, 0x56}; unsigned char flag[2] = {0x4f, 0x4e}; int main() { // 计算长度 size_t len_part1 = sizeof(part1) / sizeof(part1[0]); size_t len_flag = sizeof(flag) / sizeof(flag[0]); size_t len_part2 = sizeof(part2) / sizeof(part2[0]); size_t total_len = len_part1 + len_flag + len_part2; // 方式1:静态数组实现 unsigned char output_static[64]; // 确保大小 >= total_len memcpy(output_static, part1, len_part1); memcpy(output_static + len_part1, flag, len_flag); memcpy(output_static + len_part1 + len_flag, part2, len_part2); // 打印测试 printf("静态数组合并结果:"); for (size_t i = 0; i < total_len; i++) { printf("0x%02X ", output_static[i]); } printf("\n"); // 方式2:动态内存实现 unsigned char *output_dynamic = (unsigned char*)malloc(total_len); if (output_dynamic == NULL) { printf("内存分配失败!\n"); return -1; } memcpy(output_dynamic, part1, len_part1); memcpy(output_dynamic + len_part1, flag, len_flag); memcpy(output_dynamic + len_part1 + len_flag, part2, len_part2); // 打印测试 printf("动态数组合并结果:"); for (size_t i = 0; i < total_len; i++) { printf("0x%02X ", output_dynamic[i]); } printf("\n"); // 释放动态内存 free(output_dynamic); return 0; }
额外注意事项
- 外部数组访问:如果其他文件的数组是
static修饰的(只能在本文件访问),那你需要在对应文件里提供获取数组内容和长度的接口函数,比如size_t get_part1_len(void)和void get_part1(unsigned char *buf); - ARM架构细节:因为我们是单个字节的拷贝,所以不需要考虑端序问题;如果后续需要把合并后的数组转成多字节类型(比如uint32_t),才需要注意ARM的小端/大端模式;如果需要内存对齐(比如硬件要求),可以给数组加属性修饰,比如
unsigned char output_static[64] __attribute__((aligned(4)));; - 数组越界:静态数组的大小一定要大于等于总长度,否则会触发未定义行为;动态分配后一定要检查
malloc的返回值,避免空指针操作。
内容的提问来源于stack exchange,提问作者TomekZ
相关产品推荐
相关产品推荐

