C ++ Невозможно преобразовать std :: vector <BYTE>в строку или массив символов - PullRequest
0 голосов
/ 27 мая 2020

Я сейчас работаю с реестром, используя эту библиотеку GitHub:

https://github.com/GiovanniDicanio/WinReg

Я пытаюсь преобразовать этот vector<BYTE> в массив символов или строка, чтобы с помощью SHA-512 сделать из нее ха sh. Но я застрял в конвертации, пробовал разные методы. Я не получаю никаких ошибок компилятора, просто приложение вылетает во время выполнения. Я использую DLL, которую загружаю в свой процесс.

 RegKey NetworkInterface_key(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e972-e325-11ce-bfc1-08002be10318}\\0001");

 const std::vector<BYTE> InstallTimeStamp = NetworkInterface_key.GetBinaryValue(L"InstallTimeStamp");

МОЕ РЕШЕНИЕ:

Изменено std::vector<BYTE> -> std::vector<unsigned char>

Используется это метод:

template <typename T>
std::string to_hex(T data)
{
    std::ostringstream result;
    result << std::setw(2) << std::setfill('0') << std::hex << std::uppercase << static_cast<int>(data);
    return result.str();
}

std::string dump(const std::vector<unsigned char>& data)
{
    if (data.empty()) return "";
    auto size = data.size();
    std::ostringstream result;
    for(u32 i =0; i < size; i++)
    {
        result << "0x" + to_hex(data[i]);
        if (i != size)
            result << " ";
    }
    return result.str();
}

Кредиты: U. Bulle -> C ++ Преобразование вектора в строку, где первый байт вектора равен 0

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Метод RegKey::GetBinaryValue() возвращает std::vector<BYTE>. Чтобы преобразовать эти данные в массив char[], на самом деле вам вообще не нужно преобразовывать его, вы можете просто вместо этого ввести указатель на данные:

const std::vector<BYTE> InstallTimeStamp = ...;
const char *pInstallTimeStamp = reinterpret_cast<const char*>(InstallTimeStamp.data());

Но, если вы хотите преобразовать данные в std::string, тогда std::string имеет конструкторы, подходящие для этой цели, например:

const std::vector<BYTE> InstallTimeStamp = ...;
std::string sInstallTimeStamp(reinterpret_cast<const char*>(InstallTimeStamp.data()), InstallTimeStamp.size());
const std::vector<BYTE> InstallTimeStamp = ...;
std::string sInstallTimeStamp(InstallTimeStamp.begin(), InstallTimeStamp.end());

Однако при этом хеши работают с байтами, а не с для символов или строк, поэтому вам действительно не нужно преобразовывать данные vector во что-либо еще, просто имея sh их содержимое как есть. Если вы не используете API-интерфейс хеширования, требующий ввода char / string (в таком случае вам следует найти более подходящий API-интерфейс ha sh), и в этом случае вышеуказанного должно хватить.

0 голосов
/ 27 мая 2020

Эта библиотека вам не нужна, просто сделайте следующее:

HKEY key = 0;
BYTE timestamp[16] = { 0 };
LRESULT err = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e972-e325-11ce-bfc1-08002be10318}\\0001", 0, KEY_READ, &key);
if (err == 0)
{
    DWORD dwType = 0;
    DWORD dwSize = 16;
    ::RegQueryValueEx(key, L"InstallTimeStamp", NULL, &dwType, timestamp, &dwSize);
    RegCloseKey(key);
}

Что касается преобразования этих 16 байтов в «строку». Это не имеет большого смысла, учитывая, что эти 16 байтов являются двоичными данными. Вы можете сделать это:

std::string strTimestamp((char*)timestamp, 16);

Но я подозреваю, что вы просто хотите, чтобы указатель передавался на функцию sha512, которая ожидает тип данных char*. В таком случае просто сделайте следующее:

const char* ts = (char*)timestamp;

Просто помните, что длина этого массива фиксирована и не является строкой с завершающим нулем. Таким образом, ваша функция ha sh также должна принимать параметр длины.

...