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 字符范围从 0x20
到 0x7f
。 Unicode 共享字符 0x00
到 0x7f
。
十六进制 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
的内存,如果以前不是这样的话。
我正在尝试使用 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 字符范围从 0x20
到 0x7f
。 Unicode 共享字符 0x00
到 0x7f
。
十六进制 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
的内存,如果以前不是这样的话。