在C 语言中,如何把非ASCII的十六进制数转换成字符?

编程语言 2026-07-09

我想把任意给定的十六进制值转换为一个字符,然后打印出实际的字符字符串。

给定十六进制值0xHHHHHHHH的长度可能从1到8位变化。

下面的代码使用两个十六进制值进行测试,0x410x1EB

int main(int argc, char **argv)
{
    long long_value = strtol("0x41", NULL, 16);
    int int_value = (int)long_value;
    char char_value = (char)int_value;

    printf("long_value: %ld, int_value: %d, char_value: '%c'\n", long_value, int_value, char_value);

    long long_value2 = strtol("0x1EB", NULL, 16);
    int int_value2 = (int)long_value2;
    char char_value2 = (char)int_value2;

    printf("long_value2: %ld, int_value2: %d, char_value2: '%c'\n", long_value2, int_value2, char_value2);

    printf("hex_41: '%c'\n", 0x41);
    printf("hex_1EB: '%c'\n", 0x1EB);

    return 0;
}

以下是输出结果(hex_1EB 的输出是未知的字符值,无法读取,你也不知道它是什么):

long_value: 65, int_value: 65, char_value: 'A'
long_value2: 491, int_value2: 491, char_value2: '�'
hex_41: 'A'
hex_1EB: '�'

0x1EB 的实际字符值是什么?在C 语言中如何打印实际的非ASCII字符值?

解决方案

考虑到你问题中的第一条陈述

我想把任意给定的十六进制值转换为一个字符,然后打印出实际的字符字符串。

似乎你需要的是如下。用户输入一个数字,程序输出该数字的十六进制表示形式,作为由表示输入数字的十六进制数字组成的字符串。

你问题中的第二条陈述

给定十六进制值 0xHHHHHHHH 的长度可能从1到8变化。

提示如何确定将包含输入数字的十六进制表示的字符数组的大小。

否则按原样撰写的问题没有意义。你给出的代码在做什么也没有意义。例えば,至少字符串 "0x1EB" 应该被拆分成两个字符(忽略十六进制前缀0x),在内部表示为 '\x1' 和 '\xEB'。请注意,在 C(以及 C++)中,sizeof( char ) 的值始终等于 1。因此,类型为 char 的对象只能用 2 个十六进制数字来表示。并且类型 char 可以作为 signed charunsigned char(取决于编译选项)。然而即使在这种情况下,将这些字符输出为ASCII字符也没有意义,因为并非所有ASCII字符都有可显示的表示(另请参阅我对你问题的评论)。

因此,回到我对你实际任务的假设,相应的程序可以看起来如下,例如。

#include <stdio.h>

int main( void )
{
    int x;

    printf( "Enter a number: " );

    if ( scanf( "%d", &x ) == 1 )
    {
        enum { HEX_PREFIX_LEN = 2 };

        char s[2 * sizeof( x ) + HEX_PREFIX_LEN + sizeof( ( char )'0' )] = "0x";

        size_t n = 0;

        unsigned int tmp = x;

        do 
        { 
            ++n; 
        } while ( ( tmp >>= 4 ) != 0 );

        char *p = s + HEX_PREFIX_LEN + n;

        tmp = x;

        do
        {
            unsigned int digit = tmp & 0x0F;
            *--p = digit < 10 ? digit + '0' : digit - 10 + 'A';
        } while ( ( tmp >>= 4 ) != 0 );

        printf( "%d -> %s\n", x, s );
    }
}

程序的输出可能看起来像

Enter a number: 1024 
1024 -> 0x400

或者像

Enter a number: 11259375 
11259375 -> 0xABCDEF

至少演示程序展示了一些你在作业中可以实现的技术。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章