方法1:使用sscanf或strtol转换
示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void hex_to_ascii(const char *hex_str) {
int len = strlen(hex_str);
for (int i = 0; i < len; i += 2) {
char hex_byte[3] = {hex_str[i], hex_str[i+1], '\0'};
char ascii_char = (char)strtol(hex_byte, NULL, 16);
printf("%c", ascii_char);
}
printf("\n");
}
int main() {
const char *hex_input = "48656C6C6F"; // "Hello"的十六进制表示
hex_to_ascii(hex_input);
return 0;
}
说明:
- 输入:十六进制字符串(如
"48656C6C6F")。 - 处理:
- 每次取两个字符(一个字节),例如
"48"。 - 使用
strtol将十六进制字符串转换为整数值(如0x48)。 - 强制转换为
char类型得到ASCII字符(如'H')。
- 每次取两个字符(一个字节),例如
- 输出:直接打印ASCII字符。
方法2:使用sscanf逐个解析
示例代码:
#include <stdio.h>
void hex_to_ascii_sscanf(const char *hex_str) {
int len = strlen(hex_str);
for (int i = 0; i < len; i += 2) {
unsigned int byte;
sscanf(hex_str + i, "%2x", &byte);
printf("%c", (char)byte);
}
printf("\n");
}
int main() {
const char *hex_input = "576F726C64"; // "World"的十六进制表示
hex_to_ascii_sscanf(hex_input);
return 0;
}
说明:
- 使用
sscanf直接解析两个字符为十六进制数(%2x格式)。 - 适用于固定长度的十六进制输入。
方法3:处理奇数长度或非十六进制字符
示例代码(带错误检查):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
void hex_to_ascii_safe(const char *hex_str) {
int len = strlen(hex_str);
if (len % 2 != 0) {
printf("Error: Hex string must have even length.\n");
return;
}
for (int i = 0; i < len; i += 2) {
if (!isxdigit(hex_str[i]) || !isxdigit(hex_str[i+1])) {
printf("Error: Invalid hex character at position %d.\n", i);
return;
}
char hex_byte[3] = {hex_str[i], hex_str[i+1], '\0'};
char ascii_char = (char)strtol(hex_byte, NULL, 16);
printf("%c", ascii_char);
}
printf("\n");
}
int main() {
const char *hex_input = "4A61766120436F6465"; // "Java Code"的十六进制表示
hex_to_ascii_safe(hex_input);
return 0;
}
说明:
- 检查输入长度是否为偶数。
- 使用
isxdigit验证字符是否为有效的十六进制数字。 - 提供错误提示,增强健壮性。
方法4:直接操作字节(适用于已知固定长度)
示例代码:
#include <stdio.h>
void hex_to_ascii_fixed(const char *hex_str, int length) {
for (int i = 0; i < length; i += 2) {
char byte = (hex_str[i] << 4) | (hex_str[i+1]);
printf("%c", byte);
}
printf("\n");
}
int main() {
const char *hex_input = "5468697320697320612074657374"; // "This is a test"
hex_to_ascii_fixed(hex_input, 20); // 指定长度
return 0;
}
说明:
- 通过位移和或运算直接组合两个字符为一个字节。
- 需确保输入字符是有效的十六进制数字(如
'5'和'4'会被错误处理)。
- 推荐方法:方法1(
strtol)或方法2(sscanf),简洁且易读。 - 健壮性:方法3适合需要严格验证的场景。
- 性能:方法4最快,但需确保输入合法性。
根据实际需求选择合适的方法,并注意输入验证以避免错误。

(图片来源网络,侵删)

(图片来源网络,侵删)
