需要一些帮助。到目前为止,我已经弄清楚了如何显示输入值的二进制转换,但我需要一些有关如何将这些二进制值添加到数组中的提示,以便实际能够使用二进制值。是否可以通过开关盒填充阵列?就像我在"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;
}
当你写binary[i] = 0000
时,你是说你正在将八进制常量分配给binary[i]
这是0
。省略所有前导零。但第一个零表示常数应解释为八进制一。另一个例子: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 倍。
可能的方法可以解决这个问题,具体取决于您希望如何保存/表示各个十六进制值。您可以将每个值保留在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)nn", value, value);
for (i = 0; i < NBYTES; i++)
printf (" binary[%d] : 0x%xn", 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 - -
仔细看看,让我知道这是否是你所设想的。