在C 语言中,如何把非ASCII的十六进制数转换成字符?
我想把任意给定的十六进制值转换为一个字符,然后打印出实际的字符字符串。
给定十六进制值0xHHHHHHHH的长度可能从1到8位变化。
下面的代码使用两个十六进制值进行测试,0x41 和 0x1EB:
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 char 或 unsigned 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。