如何将十六进制字符串转换为无符号字符串?代码报错求助
十六进制字符串转无符号字符数组的正确实现
你的代码错误原因很明确:
- 直接将字符串指针
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
相关产品推荐
相关产品推荐

