Как преобразовать двоичный байт в печатное числовое значение?

Я должен преобразовать зашифрованный текст 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.)

Другие вопросы по тегам