строка & lt; — & gt; преобразование байтов []

Я внедряю систему, которая использует libcrafter а также crypto++ для передачи определенных кадров в сети. Но проблема, с которой я застрял, совсем не на этом уровне.

Речь идет о преобразовании между типами, используемыми в этих библиотеках.


1) При выбросе (решено)

Я пытаюсь преобразовать Crafter::byte array к std::stringдля того, чтобы поместить это сообщение в кадр сети (как вектор инициализации для шифрования / дешифрования AES).

Кроме того, iv должен быть обнулен, и я не могу инициализировать его должным образом (несмотря на ответы Вот или же там).

РЕДАКТИРОВАТЬ : чтобы инициализировать его в 00, я должен был сделать это в шестнадцатеричном : 0x30. И преобразовать его в std::string Я должен был предоставить длину, т.е. ivLen2 (спасибо за ответы).

Вот что я делаю:

const int ivLen2 = 2;
std::string encrypted_message("whatever");

Crafter::byte iv[ivLen2]={0x30, 0x30}; // crypto salt of 2 bytes at 0.

std::string ivStr( reinterpret_cast< char const* >(iv), ivLen2 ) ;

string mess2send = ivStr + encrypted_message;

И если я покажу их, с этим:

cout<<"iv[0] : "<<iv[0]<<endl;            // display 0
cout<<"mess2send : "<<mess2send<<endl;    // display 00whatever

Почему бы мне просто не создать обнуленную строку и не отправить ее? Для того, чтобы иметь общие функции и повторно используемый код.


2) На приеме (в ожидании)

Без сюрпризов я должен сделать наоборот. Я получаю iv и message объединены в vector<byte>* payloadи я должен извлечь iv как byte arrayи message в строке

message на самом деле не проблема, учитывая, что std::string близко к vector,

Вот что я соблазняю, чтобы получить iv :

Crafter::byte iv[ ivLen2 ];
for (int i = 0; i < ivLen2; i++)
{
iv[i] = (byte)payload->at(i);
}
std::string iv_rcv( reinterpret_cast< char const* >(iv) ) ;

И для их отображения я делаю (в том же цикле):

cout<<iv[i];

Но это дает мне не-ASCII характер.

Я также попробовал это (после этот а также этот ответы):

Crafter::byte* iv;

std::string iv_rcv( payload->begin(), payload->begin()+ivLen2 ) ;
iv = (byte*)iv_rcv.c_str();

Но это не дает мне предполагаемый инициализированные значения …

У кого-нибудь есть подсказка? Мой код неверен?

0

Решение

Я не думаю, что это будет работать:

const int ivLen2 = 2;
std::string encrypted_message("whatever");

Crafter::byte iv[ivLen2]={0x00, 0x00}; // crypto salt of 2 bytes

std::string ivStr( reinterpret_cast< char const* >(iv) ) ;

Как работает std::string знать, сколько данных копировать с iv указатель?

Вы должны использовать конструктор, который принимает длина из данных, как:

std::string ivStr( reinterpret_cast< char const* >(iv), ivLen2 ) ;

только указатель Конструктор предназначен для специально закодированных строк, которые заканчиваются нулевой символ. Если вы не используете один из тех, вы должны пройти длину.

Попробуй это:

const int ivLen2 = 2;
std::string encrypted_message("whatever");

Crafter::byte iv[ivLen2]={0x00, 0x00}; // crypto salt of 2 bytes

std::string ivStr( reinterpret_cast< char const* >(iv), ivLen2 ) ;

std::string mess2send = ivStr + encrypted_message;

std::cout << (int)mess2send[0] << (int)mess2send[1] << mess2send.substr(2) << '\n';
1

Другие решения


По вопросам рекламы [email protected]