2014-02-22 4 views
1

Мне нужно преобразовать зашифрованный текст CRYPTO ++ AES из 128 бит в строчную числовую строку.Как преобразовать двоичный байт в числовое значение для печати?

В настоящее время я использую следующий код для кастинга, но bitset слишком медленный для моего случая. Кто-нибудь знает эффективный способ сделать это?

string output = ""; 
for (std::size_t i = 0; i < 16; ++ i) { 
    output += bitset<8>(ciphertext[i]).to_string(); 
} 

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

+0

вы должны иметь двоичный, или шестнадцатеричное делать? – zwol

+0

VoidBunny - что значит «слишком медленно»? С чем вы сравниваете? – jww

ответ

0

Я бы

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]); 

Это, безусловно, будет быстрее, чем то, что вы есть, за счет хорошего немного большим повторением. Он создает шестнадцатеричные, а не двоичные, но очень вероятно, что hex - это то, что вы действительно хотите.

(В случае, если вы не видели строковая константа конкатенации раньше: отсутствие запятой после первой половины строковой константы является намеренным.)

(Пожалуйста, скажите мне, что вы не используете ECB.)

+0

Если вы не хотите повторения, это, конечно, можно было бы превратить в цикл, хотя вам придется отрегулировать печатаемое местоположение, а также извлечение байта. – keshlam

+0

@keshlam Право. Я решил, что задействование дополнительного указателя будет отвлекать. – zwol

2

Существует множество умных методов для вычисления двоичной строки из числа, но это не имеет большого значения; Какой бы метод вы используете, вы можете использовать этот метод, чтобы заполнить таблицу один раз:

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) не может повредить.

+0

Две небольшие заметки на вашем английском языке. Точка с запятой до «если» была бы лучше, чем полная остановка. «Этот метод» должен быть «этим методом». – zwol

+0

@ Zack - wtf является точкой этого комментария? У вас есть моменты, чтобы сделать исправление, если вы чувствуете себя склонным. – jww

+0

Я действительно хочу избежать использования битового набора, потому что эта функция в настоящее время является узким местом для времени выполнения. Избавление от него и замена более быстрой функцией - это то, что я хочу сделать. – VoidBunny

0
string output = ""; 
for (std::size_t i = 0; i < 16; ++ i) { 
    output += bitset<8>(ciphertext[i]).to_string(); 
} 

Там также Crypto ++ метод источник/приемник, если вы itnerested:

string output; 
ArraySource as(ciphertext, sizeof(ciphertext), 
    true /*pump*/, 
    new HexEncoder(
     new StringSink(output) 
    ) // HexEncoder 
); // ArraySource 
+0

Спасибо за предложение, но оно еще медленнее, чем битсет. Вы знаете какую-либо более быструю функцию в CRYPTO ++? – VoidBunny

+0

Я думаю, что ответ Зака, вероятно, будет самым быстрым (но я не знаю точно, потому что я не профилирую их). – jww

Смежные вопросы