Застрял в цикле, когда переход на C ++ - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь переписать этот код на С ++, который создает мини-закрытый ключ биткойн

using System;
using System.Text;
using Org.BouncyCastle.Security;


 public string CreateRandomMinikey(){
        string keytotry = "S6c56bnXQiBjk9mqSYE7ykVQ7NzrQA";
        char[] chars = keytotry.ToCharArray();
        char[] charstest = (keytotry + "?").ToCharArray();            
        while (Util.ComputeSha256(utf8.GetBytes(charstest))[0] != 0) {// hash sha256 the key & check if the first character was '0'
                // As long as key doesn't pass typo check, increment it.
                for (int i = chars.Length - 1; i >= 0; i--) {
                    char c = chars[i];
                    if (c == '9') {
                        charstest[i] = chars[i] = 'A';                        
                        break;
                    } else if (c == 'H') {
                        charstest[i] = chars[i] = 'J';
                        break;
                    } else if (c == 'N') {
                        charstest[i] = chars[i] = 'P';
                        break;
                    } else if (c == 'Z') {
                        charstest[i] = chars[i] = 'a';
                        break;
                    } else if (c == 'k') {
                        charstest[i] = chars[i] = 'm';
                        break;
                    } else if (c == 'z') {
                        charstest[i] = chars[i] = '2';
                        // No break - let loop increment prior character.
                    } else {
                        charstest[i] = chars[i] = ++c;
                        break;
                    }
                }
            }
            string result  = new string(chars);//expect S6c56bnXQiBjk9mqSYE7ykVQ7NzrRy
            return result;
        }

Вот мой код, когда я преобразую в С ++

#include "stdafx.h"
#include <string.h>
#include <iostream>
#include <cstring>
#include "sha256.h"

using namespace std;

int main()
{   
    string input = "S6c56bnXQiBjk9mqSYE7ykVQ7NzrQA";
    string inputcharstest = input+"?";
    char * chars = new char[input.size() + 1];
    strcpy(chars, input.c_str());//convert input to char array
    char * charstest = new char[inputcharstest.size() + 1];
    strcpy(charstest, inputcharstest.c_str());// convert inputcharstest to char array
    string output = sha256(inputcharstest); //hash sha256 inputcharstest to check typo
    while (output[0] != '0') {
        for (int i = strlen(chars) - 1; i >= 0; i--) {
            char c = chars[i];
            if (c == '9') {
                charstest[i] = chars[i] = 'A';
                break;
            }
            else if (c == 'H') {
                charstest[i] = chars[i] = 'J';
                break;
            }
            else if (c == 'N') {
                charstest[i] = chars[i] = 'P';
                break;
            }
            else if (c == 'Z') {
                charstest[i] = chars[i] = 'a';
                break;
            }
            else if (c == 'k') {
                charstest[i] = chars[i] = 'm';
                break;
            }
            else if (c == 'z') {
                charstest[i] = chars[i] = '2';              
            }
            else {
                charstest[i] = chars[i] = ++c;
                break;
            }
        }
    }
    string result = string(chars); //expect S6c56bnXQiBjk9mqSYE7ykVQ7NzrRy
        cout << "input('" << input << "'):" << result << endl;

    return 0;
}

enter image description here

Это ожидаемый результат enter image description here

Код застрял и возвращает пустое значение, когда я запускаю его в консольном приложении, отлаживаю иузнайте, что он застрял в цикле while навсегда.Могу ли я спросить, есть ли проблемы с этим и как я могу это исправить?

1 Ответ

0 голосов
/ 23 ноября 2018

Здесь вы каждый раз меняете содержимое строки:

 char[] charstest = (keytotry + "?").ToCharArray();            
    while (Util.ComputeSha256(utf8.GetBytes(charstest))[0] != 0) {

charstest изменяется при каждом проходе цикла, поэтому тест в while может в какой-то момент завершиться.Однако в коде C ++ вы этого не делаете:

string output = sha256(inputcharstest); //hash sha256 inputcharstest to check typo
while (output[0] != '0') {

Здесь хеш выполняется только один раз перед циклом, а затем снова не в цикле.Цикл не меняет output вообще и не break из while, поэтому, если output[0] != '0' равен true в первый раз, он всегда будет истинным, то есть бесконечный цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...