Преобразовать const wchar_t * в unsigned char * - PullRequest
4 голосов
/ 02 октября 2011

В C ++ можно конвертировать 'const wchar_t *' в 'unsigned char *'?

Как я могу это сделать?

wstring dirName;
unsigned char* dirNameA = (unsigned char*)dirName.c_str();

// I am creating a hash from a string
hmac_sha256_init( hash, (unsigned char*)dirName.c_str(), (dirName.length)+1 );

Ответы [ 3 ]

2 голосов
/ 02 октября 2011

Вам нужно конвертировать символ за символом. Для этого есть функции типа wcstombs.

2 голосов
/ 03 октября 2011

Поскольку вы используете WinAPI, используйте WideCharToMultiByte.

2 голосов
/ 02 октября 2011

Попробуйте использовать reinterpret_cast.Итак:

unsigned char * dirNameA = reinterpret_cast<unsigned char *>(dirName.c_str());

Это может не сработать, потому что c_str возвращает const wchar_t *, поэтому вы также можете попробовать:

unsigned char * dirNameA = reinterpret_cast<unsigned char *>(
                               const_cast<wchar_t *>(dirName.c_str())
                           );

Это работает, потому что hmac_sha256_init должен принимать двоичный двоичный объект в качестве входных данных,поэтому строка юникода, содержащаяся в dirName, является допустимым вводом хеша.

Но в вашем коде есть ошибка - длина, возвращаемая функцией dirName.length (), представляет собой количество символов, а не количество байтов.Это означает, что передача hmac_sha256_init слишком малого количества байтов, поскольку вы передаете строку Юникода в виде двоичного двоичного объекта, поэтому вам нужно умножить (dirName.length ()) на 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...