itoa为字符输入提供7位输出

时间:2016-06-25 20:36:28

标签: c itoa

我正在尝试使用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上的第一个问题,对于任何错误事先感到抱歉。

3 个答案:

答案 0 :(得分:0)

函数itoa对要转换的值采用int参数。如果您传递char类型的值,它将被提升为int.那么该函数将如何知道您期望的前导零数?然后,如果你曾要求基数10,你会期望多少前导零?实际上,它会抑制前导零。

答案 1 :(得分:0)

请参阅ASCII Table,注意十六进制列和ASCII字符的msb为0.可打印的ASCII字符范围从0x200x7f。 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是目的地。

在您的情况下,您只需要使用strcatsprintf( s1, "%2X\n", *opt);替换sprintf( s1, "%s\n", your_binary_conversion_function(opt) );行。

请注意,使用前者,您必须为s1中的每个charopt增加2,因为一个8位值是2个十六进制符号。

如果不是以前的情况,您可能还必须自己管理s1的记忆。

资料来源:
MK27's second answer
sprintf prototype