2017-02-21 81 views
1

У меня есть std::string с большим целым числом, закодированным в Base16:Преобразование закодированных std :: string из Base16 в Base10?

bbb91c1c95b656f386b19ab284b9c0f66598e7761cd71569734bb72b6a7153b77613a6cef8e63 
e9bd9bb1e0e53a0fd8fa2162b160fcb7b461689afddf098bfc32300cf6808960127f1d9f0e287 
f948257f7e0574b56585dd1efe1192d784b9c93f9c2215bd4867062ea30f034265374fa013ab4 
5af06cd8554fd55f1c442c2ed 

Я хочу std::string с большим целым числом, закодированным в Base10:

13182363340585954094154991955162141609757130565683854218475776626603716062690 
50741824486137510938646762753180989129520441058729412931959771922633699694948 
46611764803267065720664398942078304585998290003537553345030144535441671492050 
01138054588415687622649540474976282005406232907125282540703919964112809484362 
9 

Как конвертировать строки из Base16 в Base10 ?

+0

Несомненно, добавляю это прямо сейчас! – 123problem

+0

Они являются строками, получены n из поколения ключей rsa, конвертируют n из CryptoPP :: Integer в строку (благодаря вашей помощи благодаря), шифруют n в base64 (всегда строка: здесь код -> std :: string hexencoded; CryptoPP: : StringSource ss (CryptoppIntegerToString (n), true, новый CryptoPP :: Base64Encoder (newCryptoPP :: StringSink (hexencoded), false)); После того, как у меня есть закодированная строка Base64, я шифрую его с помощью RC6 и оболочки, затем сохраните его в реестр, хочу дешифровать его, я взял строку, расшифровал ее, но я получил шестнадцатеричный код, и это моя проблема, я хочу преобразовать его в десятичную десятину – 123problem

+0

Нет проблем. Я сейчас отредактирую свой вопрос! – 123problem

ответ

1

Поскольку вам не нужна библиотека, вам нужен код. Это не тривиальная проблема, но и не слишком сложная. Начнем с my Bignum class from another answer и добавим несколько функций к нему.

class Bignum 
{ 
    //... 

    Bignum& operator+=(int rhs) 
    { 
     assert(rhs >= 0 && rhs <= 999999999); 
     uint32_t carry = rhs; 
     for (size_t i = 0; i < parts.size(); i++) 
     { 
      uint32_t sum = parts[i] + carry; 
      parts[i] = (uint32_t)(sum % 1000000000UL); 
      carry = (uint32_t)(sum/1000000000UL); 
     } 
     if (carry != 0) 
      parts.push_back(carry); 
     return *this; 
    } 

    void FromHex(const char * pString) 
    { 
     while (*pString != 0) 
     { 
      char ch = toupper(*pString++); 
      assert((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F')); 
      int digit = (ch <= '9') ? (ch - '0') : (ch - 'A' + 10); 
      *this *= 16; 
      *this += digit; 
     } 
    } 

Смотрите все это в действии: http://coliru.stacked-crooked.com/a/cb5061a00c945875

+0

Привет, Марк, спасибо заранее, я ошибся, я мог принять библиотеку, но мне не нужна большая библиотека, поскольку я компилирую в MultiThread (Visual Studio/MT), а библиотека, например, osstream, занимает много места. – 123problem

+0

@ 123 проблема не проблема, если вы получаете лучший ответ просто accep это. –

+0

Попытайтесь прямо сейчас ответить, спасибо, что нашли время, чтобы помочь мне :) – 123problem

1

Преобразовать закодированный зЬй :: строку из Base16 в Base10?

Следующие должны работать на вас. В приведенном ниже коде показано, как это сделать с помощью строк стиля C, которые легко концептуализировать. Ваш предыдущий вопрос в Convert CryptoPP::Integer to LPCTSTR имеет ссылки.

#include <iostream> 
#include <string> 
using namespace std; 

#include "cryptlib.h" 
#include "integer.h" 
using namespace CryptoPP; 

int main(int argc, char* argv[]) 
{ 
    string s2, s1 = 
     "bbb91c1c95b656f386b19ab284b9c0f66598e7761cd71569734bb72b6a7153b77613a6cef8e63" 
     "e9bd9bb1e0e53a0fd8fa2162b160fcb7b461689afddf098bfc32300cf6808960127f1d9f0e287" 
     "f948257f7e0574b56585dd1efe1192d784b9c93f9c2215bd4867062ea30f034265374fa013ab4" 
     "5af06cd8554fd55f1c442c2ed"; 

    // Append 'h' to indicate Base16 
    // Integer n((s1 + "h").c_str()); 

    // Prepend '0x' to indicate Base16 
    Integer n(("0x" + s1).c_str()); 

    // Convert to Base10 
    s2 = IntToString<Integer>(n, 10); 
    cout << s2 << endl; 

    return 0; 
} 

Код выше показывает вам, как сделать это со строками C-стиле, который легко осмыслять. Другой способ сделать это использует Crypto ++ Pipeline для преобразования строки ASCII в массив байтов байтов.

#include <iostream> 
#include <string> 
using namespace std; 

#include "cryptlib.h" 
#include "integer.h" 
#include "filters.h" 
#include "hex.h" 
using namespace CryptoPP; 

int main(int argc, char* argv[]) 
{ 
    string s3, s2, s1 = 
     "bbb91c1c95b656f386b19ab284b9c0f66598e7761cd71569734bb72b6a7153b77613a6cef8e63" 
     "e9bd9bb1e0e53a0fd8fa2162b160fcb7b461689afddf098bfc32300cf6808960127f1d9f0e287" 
     "f948257f7e0574b56585dd1efe1192d784b9c93f9c2215bd4867062ea30f034265374fa013ab4" 
     "5af06cd8554fd55f1c442c2ed"; 

    // Use a HexDecoder to convert to big-endian array 
    StringSource ss(s1, true, new HexDecoder(new StringSink(s2))); 

    // Use big-endian array to construct n 
    Integer n((const byte*)s2.data(), s2.size()); 

    // Convert to Base10 
    s3 = IntToString<Integer>(n, 10); 
    cout << s3 << endl; 

    return 0; 
} 

Вот еще один способ выполнить преобразование с использованием Crypto ++ Pipeline.

#include <iostream> 
#include <string> 
using namespace std; 

#include "cryptlib.h" 
#include "integer.h" 
#include "filters.h" 
#include "hex.h" 
using namespace CryptoPP; 

int main(int argc, char* argv[]) 
{ 
    string s2, s1 = 
     "bbb91c1c95b656f386b19ab284b9c0f66598e7761cd71569734bb72b6a7153b77613a6cef8e63" 
     "e9bd9bb1e0e53a0fd8fa2162b160fcb7b461689afddf098bfc32300cf6808960127f1d9f0e287" 
     "f948257f7e0574b56585dd1efe1192d784b9c93f9c2215bd4867062ea30f034265374fa013ab4" 
     "5af06cd8554fd55f1c442c2ed"; 

    // Use a source to convert to big-endian array 
    StringSource ss(s1, true, new HexDecoder); 

    // Use big-endian array to construct n 
    Integer n; 
    n.Decode(ss, ss.MaxRetrievable()); 

    // Convert to Base10 
    s2 = IntToString<Integer>(n, 10); 
    cout << s2 << endl; 

    return 0; 
} 

Если вы заинтересованы в алгоритме, который преобразует ASCII строку в массив байтов для внутреннего представления, то см StringToInteger in integer.cpp. Он многократно делит на базу (2, 8, 10, 16 и т. Д.).