16进制转ASCII的C语言实现方法有哪些?

99ANYc3cd6
预计阅读时长 11 分钟
位置: 首页 C语言 正文

方法1:使用sscanfstrtol转换

示例代码:

#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;
}

说明:

  1. 输入:十六进制字符串(如"48656C6C6F")。
  2. 处理
    • 每次取两个字符(一个字节),例如"48"
    • 使用strtol将十六进制字符串转换为整数值(如0x48)。
    • 强制转换为char类型得到ASCII字符(如'H')。
  3. 输出:直接打印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最快,但需确保输入合法性。

根据实际需求选择合适的方法,并注意输入验证以避免错误。

16进制转ascii c语言
(图片来源网络,侵删)
16进制转ascii c语言
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
int a[3][3]如何正确声明与使用?
« 上一篇 今天
C语言for循环中break如何跳出循环?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]