Как преобразовать двоичный байт в печатное числовое значение?
Я должен преобразовать зашифрованный текст CRYPTO++ AES 128 битов в пригодную для печати числовую строку.
В настоящее время я использую следующий код для выполнения кастинга, но bitset
слишком медленно для моего случая. Кто-нибудь знает какой-нибудь эффективный способ сделать это?
string output = "";
for (std::size_t i = 0; i < 16; ++ i) {
output += bitset<8>(ciphertext[i]).to_string();
}
Как преобразовать двоичный байт в печатное числовое значение? Большое спасибо!
3 ответа
Есть много умных методов для вычисления двоичной строки из числа, но это не имеет значения; Какой бы метод вы ни использовали, вы можете использовать этот метод, чтобы заполнить таблицу один раз:
std::string bytes[256];
for (unsigned char c = 0; c<=255; ++c) {
bytes[c] = bitset<8>(c).to_string();
}
А потом bytes[c]
даст вам строку для конкретного байта.
В своем посте вы показываете четыре строки кода. Ниже показано, как эти четыре строки кода могли бы изменить на использование вышеуказанных предварительно вычисленных строк:
string output = "";
for (std::size_t i = 0; i < 16; ++ i) {
output += bytes[ciphertext[i]];
}
Кроме того, ваш код, вероятно, включает в себя некоторые выделения во время вашего цикла. Лучший способ избежать этого полностью зависит от того, как вы используете output
строка, но как минимум output.reserve(16*8)
не может повредить.
string output = "";
for (std::size_t i = 0; i < 16; ++ i) {
output += bitset<8>(ciphertext[i]).to_string();
}
Есть также метод источника / приемника Crypto++, если он вам нужен:
string output;
ArraySource as(ciphertext, sizeof(ciphertext),
true /*pump*/,
new HexEncoder(
new StringSink(output)
) // HexEncoder
); // ArraySource
Я бы сделал
char ct_b[16];
char ct_h[33]; // 2 hex digits per byte + NUL
snprintf(ct_h, 33,
"%02x%02x%02x%02x%02x%02x%02x%02x"
"%02x%02x%02x%02x%02x%02x%02x%02x",
ct_h[ 0], ct_h[ 1], ct_h[ 2], ct_h[ 3],
ct_h[ 4], ct_h[ 5], ct_h[ 6], ct_h[ 7],
ct_h[ 8], ct_h[ 9], ct_h[10], ct_h[11],
ct_h[12], ct_h[13], ct_h[14], ct_h[15]);
Это, безусловно, будет быстрее, чем у вас, за счет хорошего повторения. Он производит шестнадцатеричное, а не двоичное, но очень вероятно, что шестнадцатеричное это то, что вы действительно хотите.
(В случае, если вы не видели конкатенации строковых констант раньше: отсутствие запятой после первой половины строковой константы является преднамеренным.)
(Пожалуйста, скажите мне, что вы не используете ECB.)