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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:21:27