我正在尝试使用Conversion of Char to Binary in C中的示例使用C(gcc v-5.1)中的内置库(itoa)将字符转换为二进制文件,但我得到了一个7位输出字符输入到itoa函数。但由于C中的字符本质上是一个8位整数,我应该得到一个8位输出。任何人都可以解释为什么会这样??
执行二进制转换的代码:
enter for (temp=pt;*temp;temp++)
{
itoa(*temp,opt,2); //convert to binary
printf("%s \n",opt);
strcat(s1,opt); //add to encrypted text
}
PS: - 这是我在stackoverflow.com上的第一个问题,对于任何错误事先感到抱歉。
答案 0 :(得分:0)
函数itoa
对要转换的值采用int
参数。如果您传递char
类型的值,它将被提升为int.
那么该函数将如何知道您期望的前导零数?然后,如果你曾要求基数10,你会期望多少前导零?实际上,它会抑制前导零。
答案 1 :(得分:0)
请参阅ASCII Table,注意十六进制列和ASCII字符的msb为0.可打印的ASCII字符范围从0x20
到0x7f
。 Unicode通过0x00
共享字符0x7f
。
Hex 20到7f是二进制00100000到01111111.
并非所有二进制值都是可打印字符,并且在某些编码中不是合法值。
ASCII,十六进制,八进制和二进制只是表示二进制值的方法。可打印字符是另一种方式,但并非所有二进制值都可以显示,这是需要显示或处理的主要数据,因为字符文本通常转换为hex-ascii或Base64。
答案 2 :(得分:0)
您可以使用printf( "%2X\n", *opt );
将8位值打印为2个十六进制符号。
它将打印char
的第一个opt
。然后,您必须使用opt++;
将指针增加到下一个字符。
X表示您希望将其打印为大写十六进制字符(使用x表示小写),2表示即使opt
小于0x10
,也会打印2个符号。<登记/>
换句话说,价值0xF
将打印0x0F
...(实际上0F
,您可以使用printf( "%#2X\n", *opt );
来打印0x
。
如果你绝对想要一个二进制值,你必须创建一个能打印正确0和1的函数。互联网上有很多这样的函数。如果你想创建你的,阅读按位操作可以帮助你(如果你想要使用二进制文件,你必须知道按位操作)。
现在您可以根据需要打印它(如上所示的十六进制或使用您自己的二进制函数),您可以使用printf
功能重定向sprintf
的输出。
它的原型是int sprintf( char* str, const char* format, ... )
。 str
是目的地。
在您的情况下,您只需要使用strcat
或sprintf( s1, "%2X\n", *opt);
替换sprintf( s1, "%s\n", your_binary_conversion_function(opt) );
行。
请注意,使用前者,您必须为s1
中的每个char
将opt
增加2,因为一个8位值是2个十六进制符号。
如果不是以前的情况,您可能还必须自己管理s1
的记忆。