【发布时间】:2019-07-31 17:23:35
【问题描述】:
我正在尝试将字符数组转换为二进制。我已经花了一个小时阅读 SO 帖子,但很少有人能完全满足我的需要,而且没有一个对我有用。
void formatCallSign(unsigned char *callsign) {
unsigned char new[7];
printf("original is %s",callsign);
for (int j = 0; j < 6; j++) {
printf("Hex of this is %x", callsign[j]); // this correctly prints out the original hex value
char binary[9];
binary[0] = ( (callsign[j] & (1 << 7)) ? '1' : '0' );
binary[1] = ( (callsign[j] & (1 << 6)) ? '1' : '0' );
binary[2] = ( (callsign[j] & (1 << 5)) ? '1' : '0' );
binary[3] = ( (callsign[j] & (1 << 4)) ? '1' : '0' );
binary[4] = ( (callsign[j] & (1 << 3)) ? '1' : '0' );
binary[5] = ( (callsign[j] & (1 << 2)) ? '1' : '0' );
binary[6] = ( (callsign[j] & (1 << 1)) ? '1' : '0' );
binary[7] = ( (callsign[j] & (1 << 0)) ? '1' : '0' );
printf("Binary of %c is: %x\r\n", callsign[j], binary); // print hex representation of character
}
}
本质上,这个函数的输入是一个 7 个字符的字符串(char 数组)。我也使用了嵌套的for循环,但是编译器生成了没有意义的无限循环错误,所以我这样重写了。
然后我需要获取该字符的二进制表示,然后按 1 向左移位(并非总是如此,但在 95% 的情况下,我可以稍后添加逻辑)。移位后,我需要十六进制值。
获得二进制值已被证明是难以捉摸的。在之前的项目中,我永远无法正确完成,只能获得十六进制值。在这种情况下,我也可以在第二个 printf 语句中获取 hax 值,但是我不能对 hex 值进行按位移位,因为我需要移动各个位。
然而,当我运行程序时,它总是显示Binary of [char] is: 9A。总是 9A,这不是十六进制代表。我传递给它的字符串中的任何个字符。
我的想法是使用sprintf 并传入数组并使用%x 来获取它的十六进制表示。现在,它打印到控制台,但我实际上会将它存储在新数组中,该数组现在在这个 sn-p 中未使用。有可能以某种方式做到这一点吗?获取二进制文件的代码似乎不起作用(基于this answer 的第二部分)。
(澄清一下,我在这个 sn-p 中的第二个和第三个 printf 语句应该输出相同的东西。只有第二个有效。这样画出来的原因是我可以进行按位运算,然后使用 sprintf 将其放回连贯的单个值并从中获取十六进制。)
许多问题都解决了这个主题,但很少有帮助,因为我对将二进制文件打印到控制台不感兴趣。相反,我需要将二进制文件存储在一个变量中,对其进行按位运算,然后获得 final 二进制文件的十六进制表示。现在,我可以成功获得 original 字符的十六进制表示,但这没有帮助。
我唯一的另一个想法是manually define the binary values of every hex number,然后将其用作“查找表”,但这似乎效率低下。
要对此进行测试,所需的所有其他内容都在 main 中:
unsigned char dest[8] = "CQ ";
formatCallSign(&dest);
【问题讨论】:
-
最后一个
printf语句是错误的。您不应该为%x格式规范传递数组 (binary)。要查看数组中的内容,请分别打印每个数组元素。 (因为它是char的数组,你可以滥用C语义并用%s打印它。首先,将最后一个元素设置为0(binary[8] = 0;),然后像现在一样将它传递给printf,但将%x更改为%s。另外,删除\r。) -
以后,当您询问代码有什么问题时,请包含minimal reproducible example,以便其他人可以轻松编译和使用您的代码。
-
在编译器中打开警告。它应该警告你
binary是%x的错误参数。 -
@EricPostpischil 我想我关注了,现在正在修改。但是为什么要删除
\r?否则有新行但没有回车,导致输出混乱。回车需要\r -
@EricPostpischil 我现在也处于类似的困境中,而不是永久的
9A,而是永久的a3。您说您不能将数组传递给 sprintf - 那么您如何构建一个字符串(不可避免地是一个 char[])然后将其传递进去?我跟着这个答案:stackoverflow.com/a/2674333