【问题标题】:Converting values to binary values and storing them in arrays将值转换为二进制值并将它们存储在数组中
【发布时间】:2016-07-06 01:22:30
【问题描述】:

需要帮助。到目前为止,我已经弄清楚了如何显示输入值的二进制转换,但我需要一些关于如何将这些二进制值添加到数组中的提示,以便实际能够使用二进制值。是否可以通过开关盒填充数组?就像我在'0'的情况下这样做的。出于某种原因,当我打印 binary[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;

}

【问题讨论】:

  • 什么case '0': binary[i] = 0x0; break; case '1': binary[i] = 0x1; break; ...... case 'f': binary[i] = 0xf; break; ?
  • "..当我打印 binary[i] 的值时,它返回 0,而不是 0000" - binary[i] 是一个数字(特别是有符号整数)并且数字没有“有“前导零。您可以强制printf 显示他们:printf("%04d", binary[i]);。但这并不意味着它们被“存储”在值本身中。

标签: c arrays binary switch-statement hex


【解决方案1】:

当您编写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 倍。

【讨论】:

  • OP 在标记为 C 的问题中使用您的 C++ 代码将相当困难?
  • @David C. Rankin,感谢您的指出。我会做一些修改。
  • 仍然感谢您迄今为止的所有帮助。清理了很多我想做的事情。
  • @G。 Mata,如果有帮助,请考虑 accepting the answer
  • @Ivan Gritensko 我对在这里发帖还很陌生。感谢您的帮助!
【解决方案2】:

有许多可能的方法来解决这个问题,具体取决于您希望如何准确地保存/表示各个十六进制值。您可以将每个值保存在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 - -

查看一下,让我知道这是否是您的设想。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2017-07-15
    • 2021-03-06
    相关资源
    最近更新 更多