C ++无法将std :: vector 转换为字符串或char数组

问题描述 投票:0回答:2

我目前正在使用此GitHub库与注册表进行合作:

https://github.com/GiovanniDicanio/WinReg

我正在尝试将此vector<BYTE>转换为char数组或字符串,以便在SHA-512的帮助下对其进行哈希处理。但是我坚持转换它,我尝试了不同的方法。我没有得到任何编译器错误,只是应用程序在运行时崩溃。我正在使用加载到进程中的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");
c++ vector type-conversion byte
2个回答
0
投票

您不需要该库,只需执行以下操作:

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

但是我怀疑您只希望将指针传递给需要char*数据类型的sha512函数。如果是这样,只需执行以下操作:

const char* ts = (char*)timestamp;

请记住,该数组的长度是固定的,并且不是以null终止的字符串。因此,您的哈希函数也应采用长度参数。


0
投票

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数据转换为其他任何东西,只需按原样哈希其内容即可。除非您使用需要char / string输入的哈希API(如果这样,则应该找到一个更好的哈希API),在这种情况下,上面的内容就足够了。]

© www.soinside.com 2019 - 2024. All rights reserved.