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

如何将十六进制字符串转换为无符号字符串?代码报错求助

十六进制字符串转无符号字符数组的正确实现

你的代码错误原因很明确:

  • 直接将字符串指针string_hexadecimal强制转换为unsigned完全没有意义,指针存储的是内存地址,转成整数后无法代表十六进制字符串的实际内容。
  • 用这个强转后的整数初始化unsigned char数组属于非法操作,C语言中数组初始化需要匹配类型的初始化列表或字符串字面量,因此编译器报invalid initializer错误。

要把十六进制格式的字符串转换成对应的无符号字符数组,需要逐个解析每两个十六进制字符,将其转换为一个字节的无符号值。以下是正确的实现代码:

#include <stdio.h>
#include <ctype.h>
#include <string.h>

// 将单个十六进制字符转换为0-15的数值
int hex_char_to_val(char c) {
    c = toupper(c);
    if (c >= '0' && c <= '9') {
        return c - '0';
    } else if (c >= 'A' && c <= 'F') {
        return 10 + (c - 'A');
    }
    return -1; // 返回-1表示非法字符
}

int main() {
    char string_hexadecimal[100] = "5a2be26e5ef51ad833c153";
    unsigned char hexadecimal[100] = {0}; // 初始化数组为0
    size_t str_len = strlen(string_hexadecimal);
    size_t byte_idx = 0;

    // 检查十六进制字符串长度是否为偶数(每个字节对应两个字符)
    if (str_len % 2 != 0) {
        printf("错误:十六进制字符串长度必须为偶数\n");
        return 1;
    }

    // 遍历字符串,每两个字符转换为一个字节
    for (size_t i = 0; i < str_len; i += 2) {
        int high_nibble = hex_char_to_val(string_hexadecimal[i]);
        int low_nibble = hex_char_to_val(string_hexadecimal[i + 1]);

        // 检查是否存在非法字符
        if (high_nibble == -1 || low_nibble == -1) {
            printf("错误:字符串中包含非法十六进制字符\n");
            return 1;
        }

        // 组合高四位和低四位得到一个字节
        hexadecimal[byte_idx++] = (unsigned char)((high_nibble << 4) | low_nibble);
    }

    // 输出转换结果(可选)
    printf("转换后的无符号字符数组(十六进制):\n");
    for (size_t i = 0; i < byte_idx; i++) {
        printf("%02x ", hexadecimal[i]);
    }
    printf("\n");

    return 0;
}

代码关键点说明:

  • 单个字符转换:hex_char_to_val函数统一将字符转为大写后,判断是数字还是A-F字母,返回对应的0-15数值,非法字符返回-1。
  • 长度校验:确保输入字符串长度为偶数,避免出现单个字符无法组成完整字节的情况。
  • 字节组合:每两个十六进制字符分别对应字节的高四位和低四位,通过左移和按位或操作组合成一个完整的unsigned char值。
  • 错误处理:加入了非法字符和长度异常的判断,提升代码健壮性。

内容的提问来源于stack exchange,提问作者Jane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.10 07:13:10