我目前正在使用此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");
您不需要该库,只需执行以下操作:
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终止的字符串。因此,您的哈希函数也应采用长度参数。
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),在这种情况下,上面的内容就足够了。]