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

itoa providing 7-bit output to character input

我正在尝试使用 Conversion of Char to Binary in C 中的示例,使用 C(gcc v-5.1) 中的内置库 (itoa) 将字符转换为其二进制,但我得到的是 7 位输出字符输入到 itoa function.But 因为 C 中的字符本质上是一个 8 位整数,我应该得到一个 8 位 output.Can 谁能解释为什么会这样??

执行二进制转换的代码:

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:- 这是我在 whosebug.com 中的第一个问题,如有任何错误,请提前道歉。

函数 itoa 接受一个 int 参数作为要转换的值。如果您向它传递一个 char 类型的值,它将被提升为 int. 那么该函数如何知道您期望有多少个前导零?然后,如果您要的是基数 10,您希望有多少个前导零?实际上,它会抑制前导零。

参见 ASCII Table,注意十六进制列以及 ASCII 字符的 msb 为 0。可打印的 ASCII 字符范围从 0x200x7f。 Unicode 共享字符 0x000x7f

十六进制 20 到 7f 是二进制 00100000 到 01111111。

并非所有二进制值都是可打印字符,并且在某些编码中不是合法值。

ASCII、十六进制、八进制和二进制只是表示二进制值的方式。可打印字符是另一种方式,但不是所有的二进制值都可以显示,这是需要显示或处理的主要数据,因为字符文本一般转换为hex-ascii或Base64。

您可以使用 printf( "%2X\n", *opt ); 将 8 位值打印为 2 个十六进制符号。

它将打印 opt 的第一个 char。然后,您必须使用 opt++;.

递增指向下一个字符的指针

X 表示您希望将其打印为大写十六进制字符(使用 x 表示小写),而 2 将确保即使 opt 小于 0x10 也会打印 2 个符号.
换句话说,值 0xF 将打印 0x0F...(实际上 0F,您可以使用 printf( "%#2X\n", *opt ); 打印 0x)。

如果你绝对想要一个二进制值,你必须创建一个函数来打印正确的 0 和 1。互联网上有很多这样的函数。如果您想制作自己的,阅读有关位运算的内容可能会对您有所帮助(如果您无论如何都想使用二进制文件,则必须了解位运算)。

现在您可以根据需要打印它(如上所述的十六进制或使用您自己的二进制函数),您可以使用 sprintf 函数重定向 printf 的输出。

它的原型是int sprintf( char* str, const char* format, ... )str 是目的地。

在您的情况下,您只需将 strcat 行替换为 sprintf( s1, "%2X\n", *opt);sprintf( s1, "%s\n", your_binary_conversion_function(opt) ); 之类的内容。

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

您可能还需要自己管理 s1 的内存,如果以前不是这样的话。

来源:
MK27's second answer
sprintf prototype