【问题标题】:Conversion from float to char[32] (or vice-versa) in C在 C 中从 float 转换为 char[32](反之亦然)
【发布时间】:2018-02-06 07:51:51
【问题描述】:

我有两个变量:一个名为difffloat 具有类似894077435904.000000 的值(并非总是只有小数部分为零)和一个char[32],它是双sha256 计算的结果。我需要对它们进行比较(if(hash < diff) { //do someting }),但为此我需要将一个转换为另一个的类型。

有没有办法做到这一点?例如,将float 转换为char*(并使用strcmp 进行比较)或将char* 转换为float(并使用上述方法——如果可能的话,考虑char*是 256 位还是 32 字节长)?

我尝试将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 时,我会得到hex_str=d02b2b00。如何验证此值是否正确?使用this converter 得到不同的结果。

【问题讨论】:

  • 您需要进行数学运算以将难度转换为目标,然后您需要将目标与哈希结果进行比较(可能与memcmp)。有关如何将难度转换为目标的更多信息,请参阅here
  • 我已经做了这个数学运算(我从 json-rpc 接口读取了 bits,转换为 unsigned int 并传递给您发布的链接中列出的函数)。现在我只需要将难度与哈希进行比较,我猜。
  • 好的。为此使用memcmp。如果哈希值小于目标值,则获胜。
  • 哦,您可能需要先将其从十六进制转换为原始格式。真的,你一开始就不应该用十六进制。 Hex 真的只供人类食用。
  • 也可以使用>> shift 运算符来实现

标签: c arrays floating-point char hex


【解决方案1】:

解释得很详细here

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

示例代码:

#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 

【讨论】:

    猜你喜欢
    • 2014-01-23
    • 2020-03-01
    • 2022-01-09
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    相关资源
    最近更新 更多