将值转换为二进制值并将其存储在数组中

时间:2016-03-19 06:47:59

标签: c arrays binary switch-statement hex

需要一些帮助。到目前为止,我已经想出了如何显示输入值的二进制转换,但我需要一些关于如何将这些二进制值添加到数组中的技巧,以便实际上能够使用二进制值。是否可以通过开关盒填充阵列?就像我在案例中所做的那样' 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;

}

2 个答案:

答案 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 - -

仔细看看,让我知道这是你想象的那样。