首页 > 解决方案 > 如何从C中的1和0数组中获取十六进制数?

问题描述

我正在创建一个程序,它采用十进制数,使其成为 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。

标签: carraysbinarycharhex

解决方案


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

由于您的数组具有按顺序排列的所有位,您可以将它们一个接一个地移动到您的目标变量中。我已经调用它了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().

推荐阅读