2016-12-29 2 views
0

Моя цель состоит в том, чтобы получить это:станд :: строка BYTE []

BYTE  Data1[]  = {0x6b,0x65,0x79}; 
BYTE  Data2[]  = {0x6D,0x65,0x73,0x73,0x61,0x67,0x65}; 

Но моя отправная точка:

std::string msg = "message"; 
std::string key = "key"; 

Я не смог получить от std::string до BYTE[].

Я попытался следующие:

std::vector<BYTE> msgbytebuffer(msg.begin(), msg.end()); 
BYTE*  Data1  = &msgbytebuffer[0]; 

Это не вызывает компиляции или динамических ошибок. Однако конечный результат (я передаю это функции winapi - crypto api) не был таким же, как когда я использовал фактический массив байтов, как в самом верхнем ({0x6D,0x65,0x73,0x73,0x61,0x67,0x65}).

+1

насчет 'станд :: строка :: c_str()' 'возвращающегося константный символ *' ? – Quest

+0

Спасибо Квест за предложение, я очень новичок в написании C++, можете ли вы дать мне фрагмент/демоверсию. – Noitidart

+1

Каким образом это было иначе? – Yakk

ответ

2

Вы можете использовать string::c_str() функцию, которая возвращает указатель на C стиль строки, которые могут быть переданы в WinAPI функции, такие как:

foo(string.c_str()); 

Что это на самом деле делает то, что она возвращает указатель на массив, который содержит нуль -терминированная последовательность символов.


Я полагаю, что BYTE [] на самом деле является массивом символов. Вы можете назначить зЬй :: строку массив символов, выполнив:

std::string str = "hello"; 
BYTE byte[6]; // null terminated string; 
strcpy(byte, str.c_str()); // copy from str to byte[] 

Если вы хотите скопировать ул без 0 в конце, используйте strncpy вместо:

BYTE byte[5]; 
strncpy(byte, str.c_str(), str.length()); 
+0

Ах спасибо Quest, но мне нужно установить его в BYTE [], поскольку я использую его в нескольких местах. Но голосуйте за свое время! – Noitidart

+1

@Noitidart Я обновил свой ответ. – Quest

+0

Ах спасибо за это обновление! Можете ли вы показать, как получить его без нулевого терминатора строки. Извините, пожалуйста, я крайний новичок. – Noitidart

1

Кажется мне, что WinAPI ожидает нулевую завершенную c-строку. Вы можете достичь этого с помощью:

msg.c_str(); 

или, используя свой BYTE типа, что-то вроде этого:

std::vector<BYTE> msgbytebuffer(msg.length() + 1, 0); 
std::copy(msg.begin(), msg.end(), msgbytebuffer.begin()); 
Смежные вопросы