繁体   English   中英

C++ 无法转换 std::vector<byte> 到字符串或字符数组</byte>

[英]C++ Unable to convert std::vector<BYTE> to a string or char array

我目前正在使用这个 GitHub 库处理注册表:

https://github.com/GiovanniDicanio/WinReg

我正在尝试将此vector<BYTE>转换为 char 数组或字符串,以便在 SHA-512 的帮助下从中生成 hash。 但我坚持转换它,我尝试了不同的方法。 我没有收到任何编译器错误,只是应用程序在运行时崩溃了。 我正在使用加载到我的进程中的 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++ Converting Vector<BYTE> to string where first vector byte is 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 function 。 如果是这种情况,只需执行以下操作:

const char* ts = (char*)timestamp;

请记住,该数组的长度是固定的,不是以 null 结尾的字符串。 所以你的 hash function 也应该有一个长度参数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM