CAPL中如何将字符数组复制到字节数组?(附示例)
把十六进制字符串转成字节数组的实现方案
嘿,这个问题本质是把十六进制字符串转换成对应的字节数组,而不是简单的字符拷贝——毕竟你的buffer里存的是十六进制的文本,每两个字符对应一个字节的实际值。下面给你几种实用的实现方式,涵盖手动实现和标准库方法:
方法一:手动实现(适合嵌入式/无标准库场景)
如果你的开发环境没有现成的字符串转字节库,自己写个辅助函数处理是最靠谱的。核心思路是把每两个十六进制字符转换成一个字节:
#include <stdio.h> #include <string.h> #include <ctype.h> // 辅助函数:把单个十六进制字符转成0-15的数值 unsigned char hex_char_to_val(char c) { if (isdigit(c)) { return c - '0'; } // 处理大小写的A-F c = toupper(c); if (c >= 'A' && c <= 'F') { return 10 + (c - 'A'); } // 遇到非法字符可以根据需求报错,这里默认返回0 return 0; } int main() { char buffer[20] = "00020406080A0C0E1012"; unsigned char data[10]; // 如果你的环境定义了byte,可以替换成byte size_t str_len = strlen(buffer); // 先检查字符串长度是否是偶数,否则无法完整转换 if (str_len % 2 != 0) { printf("Error: 十六进制字符串长度必须是偶数\n"); return 1; } // 每两个字符转成一个字节 for (size_t i = 0; i < str_len; i += 2) { // 高4位左移4位,再和低4位做或运算 data[i/2] = (hex_char_to_val(buffer[i]) << 4) | hex_char_to_val(buffer[i+1]); } // 验证转换结果 printf("转换后的字节数组:"); for (size_t i = 0; i < sizeof(data)/sizeof(data[0]); i++) { printf("%02X ", data[i]); } // 输出应该是:00 02 04 06 08 0A 0C 0E 10 12 return 0; }
方法二:用标准库sscanf(简洁高效)
如果你的环境支持标准C库,用sscanf可以快速实现,代码更简洁:
#include <stdio.h> #include <string.h> int main() { char buffer[20] = "00020406080A0C0E1012"; unsigned char data[10]; size_t byte_count = sizeof(data)/sizeof(data[0]); // 循环读取每两个字符,转换成一个字节 for (size_t i = 0; i < byte_count; i++) { // %hhX 表示读取到unsigned char类型,避免溢出 sscanf(buffer + 2*i, "%02hhX", &data[i]); } // 验证结果 printf("转换后的字节数组:"); for (size_t i = 0; i < byte_count; i++) { printf("%02X ", data[i]); } return 0; }
关键注意事项
- 如果你用的环境没有定义
byte类型,直接用unsigned char代替即可,这是C语言里表示字节的标准类型。 - 一定要检查输入字符串的长度是否为偶数,否则最后一个字节会缺少一位,导致转换错误。
- 手动实现时可以添加非法字符的错误处理(比如返回错误码),避免无效输入导致的异常。
- 标准库方法虽然简洁,但在资源受限的嵌入式环境中可能无法使用,这时候手动实现是更好的选择。
内容的提问来源于stack exchange,提问作者Akash shah
相关产品推荐
相关产品推荐

