递增二进制值(unsigned char)

时间:2014-07-01 14:36:02

标签: 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

1 个答案:

答案 0 :(得分:2)

得到了你。

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

我认为这(或非常类似的东西)是你正在寻找的东西。我不是100%在二进制数组中的数组位置,但怀疑它是好的。

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