0

我正在尝试使用 C(gcc v-5.1) 中的内置库 (itoa) 将字符转换为其二进制文件,使用 C 中的从Char 转换为二进制的示例,但我得到一个字符输入的 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 上的第一个问题,对于任何错误,我们深表歉意。

4

3 回答 3

0

请参阅ASCII Table,注意十六进制列,对于 ASCII 字符,msb 为 0。可打印的 ASCII 字符范围从0x20thru 0x7f。Unicode0x00通过共享字符0x7f

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

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

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

于 2016-06-25T21:38:34.640 回答
0

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

它将打印char. opt然后,您必须使用 增加指向下一个字符的指针opt++;

X 表示您希望将其打印为大写十六进制字符(使用 x 表示小写),并且 2 将确保它会打印 2 个符号,即使opt小于0x10.
换句话说,该值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);or sprintf( s1, "%s\n", your_binary_conversion_function(opt) );

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

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

资料来源:
MK27 的第二个答案
sprintf 原型

于 2016-06-26T11:38:14.327 回答
0

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

于 2016-06-25T21:04:52.283 回答