需要一些帮助。到目前为止,我已经想出了如何显示输入值的二进制转换,但我需要一些关于如何将这些二进制值添加到数组中的技巧,以便实际上能够使用二进制值。是否可以通过开关盒填充阵列?就像我在案例中所做的那样' 0'。出于某种原因,当我打印二进制[i]的值时,它返回0,而不是0000。
int main()
{
int i = 0;
char hexstring[] = "24020004";
int binary[8];
while(hexstring[i])
{
switch(hexstring[i])
{
case '0': binary[i] = 0000; printf("%i", binary[i]); printf("0000"); break;
case '1': printf("0001"); break;
case '2': printf("0010"); break;
case '3': printf("0011"); break;
case '4': printf("0100"); break;
.
.
.
case 'f': printf("1111"); break;
default: printf("\nInvalid hexadecimal digit %c ", hexstring[i]);
}
i++;
}
return 0;
}
答案 0 :(得分:3)
当你写binary[i] = 0000
时,你说你要将八进制常量赋给binary[i]
0
。省略所有前导零。但是第一个零表示该常量应该被解释为 octal 一个。
另一个例子:int x = 000011
只是意味着为x
分配了11
的八进制值或9
的十进制值。这就是编译器理解常量的方式。
当值存储在内存中时,它不知道它是从哪个基础写入的。如您所知,所有数字都以二进制表示形式存储。但是,数字可能在不同的基础上有许多视图。我们可以方便地使用十进制 视图中的数字。
printf
有许多说明符可以输出一些表示形式,它们是%u
- 十进制,%x
- 十六进制,%o
- 表示八进制。不幸的是没有输出二进制数表示的选项。为了在base2中输出数字,应手动计算每个二进制数字(0或1)并按相应的顺序打印。
尝试使用以下代码输出二进制数表示。
void printInBase2(int n) {
if(n == 0) { printf("0"); return; }
int b = 0;
for(b = 0; n >> b + 1; b++);
for(; b >= 0; b--)
printf("%c", (n >> b) % 2 + '0');
}
要从存储在字符串中的十六进制表示中读取数字,您可以执行以下操作:
unsigned int number;
char hexstring[] = "24020004";
sscanf(hexstring, "%x", &number);
如果你想在int binary[]
数组中存储二进制数字,你可以用字符串
case '0': binary[4 * i + 3] = 0, binary[4 * i + 2] = 0, binary[4 * i + 1] = 0, binary[4 * i] = 0; break;
case '1': binary[4 * i + 3] = 0, binary[4 * i + 2] = 0, binary[4 * i + 1] = 0, binary[4 * i] = 1; break;
case '2': binary[4 * i + 3] = 0, binary[4 * i + 2] = 0, binary[4 * i + 1] = 1, binary[4 * i] = 0; break;
...
case 'f': binary[4 * i + 3] = 1, binary[4 * i + 2] = 1, binary[4 * i + 1] = 1, binary[4 * i] = 1; break;
这样您将分别存储每个二进制数字。请注意,binary
数组应该比hexstring
长4倍。
答案 1 :(得分:0)
有多种可能的方法可以解决此问题,具体取决于您希望保持/表示各个十六进制值的具体程度。您可以在binary[x]
中保留每个值,并在接近问题时创建打印输出(例如"0010"
)。要创建一个包含正确数值的变量,您可以通过将每个十六进制值移动适当的量来构建值。这是一种方法:
#include <stdio.h>
enum { NBYTES = 8, NBAD = 128 };
int main (int argc, char **argv) {
int i = 0, j = 0, n = 0;
char *hexstring = argc > 1 ? argv[1] : "24020004",
nothex[NBAD] = "";
unsigned int binary[NBYTES] = {0},
value = 0;
while (j < NBYTES && hexstring[i]) /* validate j to prevent overflow */
{
char *fmt = j > 0 ? "-%s" : "\n%s";
switch (hexstring[i])
{
case '0': binary[j] = 0b0000; printf (fmt, "0000"); break;
case '1': binary[j] = 0b0001; printf (fmt, "0001"); break;
case '2': binary[j] = 0b0010; printf (fmt, "0010"); break;
case '3': binary[j] = 0b0011; printf (fmt, "0011"); break;
case '4': binary[j] = 0b0100; printf (fmt, "0100"); break;
case '5': binary[j] = 0b0101; printf (fmt, "0101"); break;
case '6': binary[j] = 0b0110; printf (fmt, "0110"); break;
case '7': binary[j] = 0b0111; printf (fmt, "0111"); break;
case '8': binary[j] = 0b1000; printf (fmt, "1000"); break;
case '9': binary[j] = 0b1001; printf (fmt, "1001"); break;
case 'a': binary[j] = 0b1010; printf (fmt, "1010"); break;
case 'b': binary[j] = 0b1011; printf (fmt, "1011"); break;
case 'c': binary[j] = 0b1100; printf (fmt, "1100"); break;
case 'd': binary[j] = 0b1101; printf (fmt, "1101"); break;
case 'e': binary[j] = 0b1110; printf (fmt, "1110"); break;
case 'f': binary[j] = 0b1111; printf (fmt, "1111"); break;
default: nothex[n] = hexstring[i];
n += n < NBAD - 1;
goto badval;
}
/* value - holding numeric value */
value += ('0' <= hexstring[i] && hexstring[i] <= '9') ?
(hexstring[i] - '0') << ((NBYTES - 1 - j) * sizeof value) :
(hexstring[i] - 'W') << ((NBYTES - 1 - j) * sizeof value);
j++;
badval:
i++;
}
printf ("\n value : 0x%08x (%u)\n\n", value, value);
for (i = 0; i < NBYTES; i++)
printf (" binary[%d] : 0x%x\n", i, binary[i]);
if (*nothex) {
printf ("\nwarning: invalid hexadecimal digit(s) in input.\n");
for (i = 0; i < n; i++) printf (" %c", nothex[i]);
}
putchar ('\n');
return 0;
}
示例使用/输出
$ ./bin/hex2bin
0010-0100-0000-0010-0000-0000-0000-0100
value : 0x24020004 (604110852)
binary[0] : 0x2
binary[1] : 0x4
binary[2] : 0x0
binary[3] : 0x2
binary[4] : 0x0
binary[5] : 0x0
binary[6] : 0x0
binary[7] : 0x4
$ ./bin/hex2bin "cafebabe"
1100-1010-1111-1110-1011-1010-1011-1110
value : 0xcafebabe (3405691582)
binary[0] : 0xc
binary[1] : 0xa
binary[2] : 0xf
binary[3] : 0xe
binary[4] : 0xb
binary[5] : 0xa
binary[6] : 0xb
binary[7] : 0xe
$ ./bin/hex2bin "hi-cafe-babe-up"
1100-1010-1111-1110-1011-1010-1011-1110
value : 0xcafebabe (3405691582)
binary[0] : 0xc
binary[1] : 0xa
binary[2] : 0xf
binary[3] : 0xe
binary[4] : 0xb
binary[5] : 0xa
binary[6] : 0xb
binary[7] : 0xe
warning: invalid hexadecimal digit(s) in input.
h i - -
仔细看看,让我知道这是你想象的那样。