c++ - 递增二进制值(无符号字符)

标签 c++ binary binary-data bitcoin

我目前正在用 C++ 创建一个简单的比特币矿工,需要一些帮助来优化它的一部分。

我有一个十六进制值的字符串,由于需要在其上运行 OpenSSL sha256 哈希函数,它被解析为二进制(下面的代码)。我需要连续做 sha256 哈希,但是每次需要递增十六进制值的最后 8 个字符。

目前,我通过将二进制值转换回十六进制值,将最后 8 个字符转换为 long,递增 long,然后再次将整个转换回二进制来实现这一点,这当然是非常低效的.

递增二进制值的最佳方式是什么?

// parse an hexidemical string into a binary format
void toBytes(std::string input,unsigned char *result){
    for(int i=0, j=0; i < input.size(); j++, i+=2) {
        std::string twoChars = input.substr(i,2);
        result[j] = (unsigned char)std::stoi(twoChars,0,16);
    }
}
// converts a binary unsigned char into a hexademical string
std::string toHex(unsigned char* data, int len) {
    std::string result(""); 
    char buf[2];        
    int c;        
    c=0;
    while(c < len) {
        sprintf(buf,"%.2x", data[c++]);
        result+=buf;
    }
    return result;
}

这是我当前的、非常低效的添加:

void addNonce(unsigned char * binary, int length) {
    std::string hex = toHex(binary, length);
    std::string nonceString = hex.substr(152,8);
    long nonce = std::strtol(hex.substr(152,8).c_str(),NULL,16 );
    nonce++;
    char buf[8];
    sprintf(buf, "%.8lx", nonce);   
    hex.replace(152,8,buf);
    toBytes(hex,binary);
}

这是一个十六进制格式的递增示例(我需要递增一次,然后散列,再次递增,散列,直到最大值):

020000001fba9705b223d40c25b0aba35fee549aa477307862fb45ad18020000
0000000033d14883e297679e3f9a5eb108dab72ff0998e7622e427273e90027e
312ba443105315513c1f051a00000000

020000001fba9705b223d40c25b0aba35fee549aa477307862fb45ad18020000
0000000033d14883e297679e3f9a5eb108dab72ff0998e7622e427273e90027e
312ba443105315513c1f051a00000001

到最大值

020000001fba9705b223d40c25b0aba35fee549aa477307862fb45ad18020000
0000000033d14883e297679e3f9a5eb108dab72ff0998e7622e427273e90027e
312ba443105315513c1f051aFFFFFFFF

最佳答案

明白了。

void addNonce(unsigned char * binary, int length) {
    unsigned long *nonce = (unsigned long*) &binary[length-4];
    (*nonce)++;
}

我认为这个(或非常类似的东西)就是您要找的。我不是 100% 确定数组在二进制数组中的位置,但怀疑它很好。

当 nonce 的值溢出时,它应该重置为 0。我不确定这是否是所需的行为,但是如果需要另一个结果,在 nonce 周围添加一点溢出保护应该不会太昂贵.

关于c++ - 递增二进制值(无符号字符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24512958/

相关文章:

java - 位是如何存储在内存中的? (在 block 中?可以将多个大小的位存储在一起吗?)

Java:从二进制文件读取,通过套接字发送字节

c# - 对象到网络序列化 - 使用现有协议(protocol)

python - Python 中浮点到整数的转换速度更快

c++ - 构造函数链接和初始化语法

c++ - 片段中指针的模糊行为

c++ - mingw32-make.exe : Nothing to be done for 'all'

c++ - 指向 C++ 类数组的基本指针

javascript - 奇怪的 Javascript 添加行为

binary - 如何创建二进制补丁?