2013-06-05 19:19:00 +00:00
|
|
|
#include <fc/crypto/bigint.hpp>
|
|
|
|
|
#include <fc/io/sstream.hpp>
|
|
|
|
|
#include <fc/log/logger.hpp>
|
|
|
|
|
|
|
|
|
|
namespace fc
|
|
|
|
|
{
|
|
|
|
|
fc::string to_base36( const char* data, size_t len )
|
|
|
|
|
{
|
|
|
|
|
if( len == 0 ) return fc::string();
|
|
|
|
|
fc::bigint value( data, len );
|
|
|
|
|
auto base36 = "0123456789abcdefghijklmnopqrstuvwxyz";
|
2013-06-27 18:19:08 +00:00
|
|
|
std::vector<char> out( static_cast<size_t>(len * 1.6) + 1 );
|
2013-06-05 19:19:00 +00:00
|
|
|
int pos = out.size() - 1;
|
|
|
|
|
out[pos] = '\0';
|
|
|
|
|
fc::bigint _36(36);
|
|
|
|
|
do {
|
|
|
|
|
if( value ) {
|
|
|
|
|
--pos;
|
|
|
|
|
out[pos] = base36[(value % _36).to_int64()];
|
|
|
|
|
}
|
|
|
|
|
} while (value /= _36);
|
2015-07-25 13:32:48 +00:00
|
|
|
while (*data++ == 0) {
|
|
|
|
|
out[--pos] = '0';
|
|
|
|
|
}
|
2013-06-05 19:19:00 +00:00
|
|
|
return &out[pos]; //fc::string( &out[pos], out.size() - pos);
|
|
|
|
|
}
|
|
|
|
|
|
2013-06-27 18:19:08 +00:00
|
|
|
fc::string to_base36( const std::vector<char>& vec )
|
2013-06-05 19:19:00 +00:00
|
|
|
{
|
|
|
|
|
return to_base36( (const char*)vec.data(), vec.size() );
|
|
|
|
|
}
|
|
|
|
|
|
2013-06-27 18:19:08 +00:00
|
|
|
std::vector<char> from_base36( const fc::string& b36 )
|
2013-06-05 19:19:00 +00:00
|
|
|
{
|
2015-07-25 13:32:48 +00:00
|
|
|
if ( b36.empty() ) {
|
|
|
|
|
std::vector<char> empty;
|
|
|
|
|
return empty;
|
|
|
|
|
}
|
|
|
|
|
|
2013-06-05 19:19:00 +00:00
|
|
|
fc::bigint value;
|
|
|
|
|
|
|
|
|
|
fc::bigint pos = 0;
|
|
|
|
|
fc::bigint _36(36);
|
2015-07-25 13:32:48 +00:00
|
|
|
for( auto itr = b36.rbegin(); itr != b36.rend(); ++itr )
|
2013-06-05 19:19:00 +00:00
|
|
|
{
|
2015-07-25 13:32:48 +00:00
|
|
|
if( *itr >= '0' && *itr <= '9' )
|
|
|
|
|
value = value + _36.exp(pos) * fc::bigint(*itr - '0');
|
|
|
|
|
else if( *itr >= 'a' && *itr <= 'z' )
|
|
|
|
|
value = value + (_36.exp(pos) * fc::bigint(10+*itr - 'a'));
|
|
|
|
|
else if( *itr >= 'A' && *itr <= 'Z' )
|
|
|
|
|
value = value + (_36.exp(pos) * fc::bigint(10+*itr - 'A'));
|
2013-06-05 19:19:00 +00:00
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
wlog("unknown '${char}'", ("char",fc::string(&*itr,1)) );
|
|
|
|
|
}
|
|
|
|
|
++pos;
|
|
|
|
|
}
|
2015-07-25 13:32:48 +00:00
|
|
|
|
|
|
|
|
std::vector<char> bytes = value;
|
|
|
|
|
int leading_zeros = 0, len = bytes.size();
|
|
|
|
|
const char *in = b36.c_str();
|
|
|
|
|
while (*in++ == '0') { leading_zeros++; }
|
|
|
|
|
char* first = bytes.data();
|
|
|
|
|
while (*first == 0) { first++; len--; }
|
|
|
|
|
std::vector<char> result;
|
|
|
|
|
result.resize(leading_zeros + len, 0);
|
|
|
|
|
memcpy( result.data() + leading_zeros, first, len );
|
|
|
|
|
return result;
|
2013-06-05 19:19:00 +00:00
|
|
|
}
|
|
|
|
|
}
|