我试图使用C(gcc v-5.1)中的内置库( itoa )将一个字符转换为二进制,使用C中Char到二进制的转换中的例子,但是我得到了一个输入到itoa function.But的字符的7位输出,因为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:-这是我在stackoverflow.com上的第一个问题,很抱歉事先犯了任何错误。
发布于 2016-06-26 11:38:14
您可以使用printf( "%2X\n", *opt );打印一个8位值作为两个十六进制符号.
它将印刷第一张char of 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);或sprintf( s1, "%s\n", your_binary_conversion_function(opt) );的内容。
注意,使用前一种方法,您必须为s1中的每个char增加2,因为一个8位值是2个十六进制符号。
如果以前的情况不是这样的话,你也可能不得不独自管理s1的内存。
资料来源:
MK27 27的第二个答案
sprintf原型
发布于 2016-06-25 21:04:52
函数itoa接受要转换的值的int参数。如果您传递给它一个char类型的值,那么它将被提升为int.,那么函数如何知道您期望的前导零数?如果你要求基数10,你会期望多少前导零?实际上,它抑制了前导零点。
发布于 2016-06-25 21:38:34
请参见ASCII表,注意十六进制列,对于ASCII字符,msb为0。可打印的ASCII字符范围从0x20到0x7f。Unicode通过0x00 0x7f共享字符。
十六进制20乘7 f是二进制00100000乘01111111。
并非所有二进制值都是可打印的字符,在某些情况下,编码不是合法值。
ASCII、十六进制、八进制和二进制只是表示二进制值的方法。可打印字符是另一种方式,但并非所有二进制值都可以显示,这是需要显示或处理的主要数据,因为字符文本通常被转换为十六进制或Base64。
https://stackoverflow.com/questions/38032755
复制相似问题