十六进制数据转换为对应的字符串

十六进制数据转换为对应的字符串(例如 0x08 转换为 "08"),你可以按照以下步骤实现:

方法 1:使用 sprintf 逐个字节转换

#include <stdio.h>

void hex_to_str(const unsigned char *hex, int len, char *str) {
    for (int i = 0; i < len; i++) {
        sprintf(str + i * 2, "%02X", hex[i]); // 大写字母
        // 或者用小写字母:
        // sprintf(str + i * 2, "%02x", hex[i]);
    }
}

int main() {
    unsigned char can_id_data[12] = {0x08, 0xAB, 0xCD, 0x1F, 0x23, 0x45, 0x67, 0x89, 0x0A, 0xBC, 0xDE, 0xF0};
    char str[25] = {0}; // 12字节 * 2字符 + 1终止符 = 25字节

    hex_to_str(can_id_data, 12, str);
    printf("Result: %s\n", str); // 输出: "08ABCD1F234567890ABCDEF0"

    return 0;
}

方法 2:手动转换(避免 sprintf

#include <stdio.h>

void hex_to_str(const unsigned char *hex, int len, char *str) {
    const char *hex_chars = "0123456789ABCDEF"; // 大写字母
    // 或者用小写字母:
    // const char *hex_chars = "0123456789abcdef";

    for (int i = 0; i < len; i++) {
        str[i * 2]     = hex_chars[(hex[i] >> 4) & 0x0F]; // 高4位
        str[i * 2 + 1] = hex_chars[hex[i] & 0x0F];        // 低4位
    }
    str[len * 2] = '\0'; // 终止符
}

int main() {
    unsigned char can_id_data[12] = {0x08, 0xAB, 0xCD, 0x1F, 0x23, 0x45, 0x67, 0x89, 0x0A, 0xBC, 0xDE, 0xF0};
    char str[25] = {0}; // 12字节 * 2字符 + 1终止符 = 25字节

    hex_to_str(can_id_data, 12, str);
    printf("Result: %s\n", str); // 输出: "08ABCD1F234567890ABCDEF0"

    return 0;
}

注意事项:

  1. 大小写选择

    • 使用 %02X 或 "0123456789ABCDEF" 会生成大写字母(如 "08AB")。

    • 使用 %02x 或 "0123456789abcdef" 会生成小写字母(如 "08ab")。

  2. 缓冲区大小

    • 确保 str 足够大(2 * len + 1),以容纳转换后的字符串和终止符 \0

  3. 性能

    • 方法 2(手动转换)通常比方法 1(sprintf)更快,适合高性能场景。

示例输出:

如果 can_id_data 包含 {0x08, 0xAB, 0xCD, 0x1F, ...},转换后的字符串为:

"08ABCD1F234567890ABCDEF0"  // 大写
"08abcd1f234567890abcdef0"  // 小写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值