feat(baseN): decode(): overloading

This commit is contained in:
2024-09-12 10:27:42 +03:00
parent 07fc45817a
commit 6e159f40ee
3 changed files with 63 additions and 63 deletions

View File

@ -10,12 +10,10 @@ namespace baseN
bool isValid(const std::string &str, const int8_t *map) noexcept; bool isValid(const std::string &str, const int8_t *map) noexcept;
void encode(const uint8_t *data, uint64_t data_size, char *str, uint8_t base, const char *digits, uint64_t enc_size) noexcept; void encode(const uint8_t *data, uint64_t data_size, char *str, uint8_t base, const char *digits, uint64_t enc_size) noexcept;
void encode(const uint8_t *data, uint64_t data_size, char *str, uint8_t base, const char *digits) noexcept;
std::string encode(std::vector<uint8_t> data, uint8_t base, const char *digits, uint64_t enc_size) noexcept; std::string encode(std::vector<uint8_t> data, uint8_t base, const char *digits, uint64_t enc_size) noexcept;
std::string encode(std::vector<uint8_t> data, uint8_t base, const char *digits) noexcept; std::string encode(std::vector<uint8_t> data, uint8_t base, const char *digits) noexcept;
void decode(const char *str, uint8_t *data, uint64_t data_size, uint8_t base, const char *digits, const char *map, uint64_t dec_size); void decode(const char *str, uint8_t *data, uint64_t data_size, uint8_t base, const char *digits, const int8_t *map, uint64_t dec_size);
void decode(const char *str, uint8_t *data, uint64_t data_size, uint8_t base, const char *digits, const char *map); std::vector<uint8_t> decode(const std::string &str, uint8_t base, const char *digits, const int8_t *map, uint64_t dec_size);
std::vector<uint8_t> decode(const std::string &str, uint8_t base, const char *digits, const char *map, uint64_t dec_size); std::vector<uint8_t> decode(const std::string &str, uint8_t base, const char *digits, const int8_t *map);
std::vector<uint8_t> decode(const std::string &str, uint8_t base, const char *digits, const char *map);
} }

View File

@ -79,10 +79,6 @@ namespace baseN
} }
std::copy(res_str, res_str + enc_size, str); std::copy(res_str, res_str + enc_size, str);
} }
void encode(const uint8_t *data, uint64_t data_size, char *str, uint8_t base, const char *digits) noexcept
{
baseN::encode(data, data_size, str, base, digits, data_size * std::log(256) / std::log(base) + 1);
}
std::string encode(std::vector<uint8_t> data, uint8_t base, const char *digits, uint64_t enc_size) noexcept std::string encode(std::vector<uint8_t> data, uint8_t base, const char *digits, uint64_t enc_size) noexcept
{ {
std::string str(enc_size, ' '); std::string str(enc_size, ' ');
@ -99,51 +95,57 @@ namespace baseN
return baseN::encode(data, base, digits, data.size() * std::log(256) / std::log(base) + 1); return baseN::encode(data, base, digits, data.size() * std::log(256) / std::log(base) + 1);
} }
// void decode(const char *str, uint8_t *data, uint64_t data_size, uint8_t base, const char *digits, const char *map, uint64_t dec_size) void decode(const char *str, uint8_t *data, uint64_t data_size, uint8_t base, const char *digits, const int8_t *map, uint64_t dec_size)
// { {
// if (str[0] == '\0') if (str[0] == '\0')
// { {
// return; return;
// } }
// if (!baseN::isValid(str, map)) if (!baseN::isValid(str, map))
// { {
// throw std::logic_error("baseN::decode: out of digits map"); throw std::logic_error("baseN::decode: out of digits map");
// } }
// uint8_t *res_data = new uint8_t[dec_size]; uint8_t res_data[dec_size];
// uint64_t idx_str = 0; uint64_t idx_str = 0;
// int64_t int64_t
// zero_count = 0, zero_count = 0,
// idx_quo = dec_size - 1, idx_quo = dec_size - 1,
// idx_quo_last = dec_size - 2; idx_quo_last = dec_size - 2;
// uint16_t div; uint16_t div;
// while (str[zero_count] == digits[0]) while (str[zero_count] == digits[0])
// { {
// zero_count++; zero_count++;
// } }
// res_data[idx_quo] = map[(int8_t)str[idx_str++]]; res_data[idx_quo] = map[(int8_t)str[idx_str++]];
// while (idx_str < str.size()) while (str[idx_str] != '\0')
// { {
// div = map[(int8_t)str[idx_str++]]; div = map[(int8_t)str[idx_str++]];
// while (idx_quo > idx_quo_last && idx_quo > 0) while (idx_quo > idx_quo_last && idx_quo > 0)
// { {
// div += data[idx_quo] * base; div += res_data[idx_quo] * base;
// data[idx_quo--] = div; res_data[idx_quo--] = div;
// div >>= 8; div >>= 8;
// } }
// data[idx_quo--] = div; res_data[idx_quo--] = div;
// idx_quo_last = idx_quo; idx_quo_last = idx_quo;
// idx_quo = data.size() - 1; idx_quo = dec_size - 1;
// } }
// idx_quo = 0; std::copy(res_data, res_data + std::min(dec_size, data_size), data);
// while (data[idx_quo] == 0) }
// { std::vector<uint8_t> decode(const std::string &str, uint8_t base, const char *digits, const int8_t *map, uint64_t dec_size)
// idx_quo++; {
// } std::vector<uint8_t> data(dec_size);
// data.erase(data.begin(), data.begin() + idx_quo - zero_count); baseN::decode(str.data(), data.data(), data.size(), base, digits, map, dec_size);
// delete[] res_data; data.erase(data.begin(), std::find_if(
// } data.begin(), data.end(), [](uint8_t byte){
// void decode(const char *str, uint8_t *data, uint64_t data_size, uint8_t base, const char *digits, const char *map); return byte != 0;
// std::vector<uint8_t> decode(const std::string &str, uint8_t base, const char *digits, const char *map, uint64_t dec_size); })
// std::vector<uint8_t> decode(const std::string &str, uint8_t base, const char *digits, const char *map); );
return data;
}
std::vector<uint8_t> decode(const std::string &str, uint8_t base, const char *digits, const int8_t *map)
{
return baseN::decode(str, base, digits, map, str.size() * std::log(base) / std::log(256) + 1);
}
} }

View File

@ -44,14 +44,14 @@ TEST(baseN, encode)
// std::vector<uint8_t> data(1e6); // std::vector<uint8_t> data(1e6);
// encode(data); // encode(data);
// } // }
// TEST(baseN, decode) TEST(baseN, decode)
// { {
// EXPECT_EQ(btc::data::hex::encode(decode("Ky")), "044c"); EXPECT_EQ(hex::encode(decode("Ky", 58, b58digits, b58map)), "044c");
// EXPECT_EQ(btc::data::hex::encode(decode("KyK")), "f94a"); EXPECT_EQ(hex::encode(decode("KyK", 58, b58digits, b58map)), "f94a");
// EXPECT_EQ(btc::data::hex::encode(decode("KyKX")), "387ae2"); EXPECT_EQ(hex::encode(decode("KyKX", 58, b58digits, b58map)), "387ae2");
// EXPECT_EQ(btc::data::hex::encode(decode("KyKXa")), "0ccbd755"); EXPECT_EQ(hex::encode(decode("KyKXa", 58, b58digits, b58map)), "0ccbd755");
// EXPECT_EQ(btc::data::hex::encode(decode("KyKXaa")), "02e62ec963"); EXPECT_EQ(hex::encode(decode("KyKXaa", 58, b58digits, b58map)), "02e62ec963");
// } }
// TEST(baseN, decode_1e6) // TEST(baseN, decode_1e6)
// { // {
// std::string str(1e6, '0'); // std::string str(1e6, '0');