【问题标题】:How to obtain a hex number from an array of 1s and 0s in C?如何从C中的1和0数组中获取十六进制数?
【发布时间】:2020-02-08 15:57:17
【问题描述】:

我正在创建一个程序,它采用十进制数,使其成为 IEEE-754 单精度格式,然后从符号位、指数位和尾数位创建一个长度为 8 的十六进制数。我无法将我制作的包含所有所需位的 int 数组转换为十六进制。

我尝试了一段代码,它可以工作,但是它确实向后打印结果,我不确定如何翻转它。我也尝试存储在一个数组中,但是当我打印出该数组时,我得到了盒子。

void printHexChar(unsigned char value){
    unsigned char lower = value & 0xf; // Use binary 'and' to mask the lower byte
    unsigned char upper = (value & 0xf0) >> 4; // Use binary 'and' to mask upper byte

 if(upper >= 10) // Same as lower
        upper = 'a' + (upper - 10);
    else
        upper = upper + '0';
    if(lower >= 10) // If lower is in range [10-15], than add a value [0-5] on 'a'.
        lower = 'a' + (lower - 10);
    else
        lower = lower + '0'; // It's in range [0-9], so we have to add it to '0'.






    printf("%c%c",lower,upper); // Print out the hexadecimal number
}
void bin_array_to_hex(int *b, int length){
    if(length % 8){
        printf("Must be dividable by eight!\n");
        return;
    }
    unsigned int i;
    unsigned int j;
    for(i = 0; i < length; i = j){
        unsigned char a = 0; // Has length of 8 bits
        for(j = i; j < i+8; ++j){ // take 8 bits...
            a |= b[j]<<(j-i); // and set them in a

        }
       printHexChar(a);
    }           
}
bin_array_to_hex(arrayhex2, 32); 

我希望 2.5 的输入为 40200000,但它是 00000204。该数组取决于输入的浮点数,但对于 2.5,它是 01000000001000000000000000000000。

【问题讨论】:

  • 将结果存储在 char 数组中,然后翻转数组。这应该很容易。
  • 你好,小端?
  • 请提供minimal reproducible example。至少向我们展示您的 int 数组。
  • @Jabberwocky 我试过了,它不会打印任何数字,只是框。
  • @AlexisFlanigan 你应该显示的是你的失败代码,否则我们无能为力。

标签: c arrays binary char hex


【解决方案1】:

既然我们已经将所有部分放在一起,我可以向您展示一个解决方案。不过,我不会解释相关部分的样板代码。

由于您的数组具有按顺序排列的所有位,您可以将它们一个接一个地转移到您的目标变量中。我称它为value。它必须被初始化以防万一没有给出所有位。

#include <stdio.h>

int array[] = {
    0, 1, 0, 0, 0, 0, 0, 0,
    0, 0, 1, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0,
};

void bin_array_to_hex(int *b, int length) {
    if (length % 8) {
        printf("Length must be dividable by eight!\n");
        return;
    }
    unsigned int value = 0;
    if (length / 8 > sizeof value) {
        printf("Length must be <= %u!\n", 8 * (unsigned int)sizeof value);
        return;
    }
    while (length--) {
        value <<= 1;
        if (*b) {
            value |= 1;
        }
        b++;
    }
    printf("%08x\n", value);
}

int main(void) {
    bin_array_to_hex(array, sizeof array / sizeof array[0]);
    return 0;
}

还有一些注意事项:

  • 不需要额外的局部变量。这些参数可以看作是局部变量,实际上它们在常见环境中的处理方式非常相似。所以我们可以直接使用它们(这里:blength)。
  • 您不需要自制的十六进制打印机。 printf() 可以为您做到这一点。如果您需要字符串中的结果,请使用sprintf()

【讨论】:

    猜你喜欢
    • 2017-12-22
    • 2011-07-12
    • 2021-08-08
    • 2021-02-21
    • 2014-02-18
    • 2015-05-24
    • 2021-01-03
    • 1970-01-01
    • 2020-03-05
    相关资源
    最近更新 更多