在C中从float转换为char [32](或反之亦然)

时间:2017-08-29 01:00:47

标签: c arrays floating-point char hex

我有两个变量:一个名为float的{​​{1}},其值类似于diff(小数部分中并不总是只有零)和一个894077435904.000000 double-sha256计算的结果。我需要在它们之间进行比较(char[32]),但为此我需要将一个转换为另一个的类型。

有没有办法实现这个目标?例如,将if(hash < diff) { //do someting }转换为float(并使用char*进行比较)或strcmp转换为char*(并使用上述方法 - 如果它甚至可能,考虑到float是256位还是32字节长?

我尝试将char*转换为float,如下所示:

char*

当我char hex_str[2*sizeof(diff)+1]; snprintf(hex_str, sizeof(hex_str), "%0*lx", (int)(2*sizeof diff), (long unsigned int)diff); printf("%s\n", hex_str); 时,我得到diff=894077435904.000000。如何验证此值是否正确?使用this converter我获得了不同的结果。

1 个答案:

答案 0 :(得分:3)

详细解释here

  1. 创建一个包含32个无符号字节的数组,将其所有值设置为零。
  2. 从难度中提取顶部字节并从32减去。
  3. 将难度中的最后三个字节复制到数组中,将字节数开始到您在步骤2中计算的数组中。
  4. 此数组现在包含原始二进制文件的难度。使用memcmp将其与原始二进制文件中的哈希进行比较。
  5. 示例代码:

    #include <stdio.h>
    #include <string.h>
    
    char* tohex="0123456789ABCDEF";
    
    void computeDifficulty(unsigned char* buf, unsigned j)
    {
        memset(buf, 0, 32);
        int offset = 32 - (j >> 24);
        buf[offset] = (j >> 16) & 0xffu;
        buf[offset + 1] = (j >> 8) & 0xffu;
        buf[offset + 2] = j & 0xffu;
    }
    
    void showDifficulty(unsigned j)
    {
        unsigned char buf[32];
        computeDifficulty(buf, j);
        printf("%x -> ", j);
        for (int i = 0; i < 32; ++i)
            printf("%c%c ", tohex[buf[i] >> 4], tohex[buf[i] & 0xf]);
        printf("\n");
    }
    
    int main()
    {
        showDifficulty(0x1b0404cbu);
    }
    

    输出:

    1b0404cb -> 00 00 00 00 00 04 04 CB 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00