问题的起因是我想向系统的注册表中读取QByteArray类型的数据,代码如下
QSettings *Config_ini_Read=new QSettings("HKEY_CURRENT_USER\\SOFTWARE\\Tools",QSettings::NativeFormat);
QByteArray ba_temp = Config_ini_Read->value("ProductInfo", QByteArray()).toByteArray();
delete Config_ini_Read;
此时查看QByteArray数据,发现读取到的与原本的完全不同,随后我又试了获取后转换为QString类型
QSettings *Config_ini_Read=new QSettings("HKEY_CURRENT_USER\\SOFTWARE\\DLTools",QSettings::NativeFormat);
QVariant v = Config_ini_Read->value("ProductInfo");
QByteArray ba_temp = Config_ini_Read->value("ProductInfo", QByteArray()).toByteArray();
QString qstr_temp = v.toString();
delete Config_ini_Read;
此时查看QString的数据,发现注册表信息的0x5b 0x10变成了105b,此时我很疑惑为什么QByteArray类型无法准确获取,QString类型的数据有点像,但被整合成了一位。于是我只能开始查资料了,在结果全网搜索后,我终于在qt官方的论坛找到了解决方法(但还是不知道为什么会出现这种问题,推测可能和utf8、utf16有关)
QSettings *Config_ini_Read=new QSettings("HKEY_CURRENT_USER\\SOFTWARE\\DLTools",QSettings::NativeFormat);
QVariant v = Config_ini_Read->value("ProductInfo");
QString qstr_temp = v.toString();
QByteArray data = QByteArray((const char*)qstr_temp.utf16());
delete Config_ini_Read;
此时的data数据就与注册表中的数据一致了。
关于写入,根据我查阅的资料,QSetting暂时不支持指定格式进行写入,只是自动判断格式,所以以下通过qsetting的方法写入二进制数据是无效的
QByteArray temp = "";
temp.append(QByteArray::fromHex(QByteArray::number(0x5b,16)));
temp.append(QByteArray::fromHex(QByteArray::number(0x10,16)));
temp.append(QByteArray::fromHex(QByteArray::number(0x35,16)));
temp.append(QByteArray::fromHex(QByteArray::number(0x86,16)));
QSettings *Config_ini_Write= new QSettings("HKEY_CURRENT_USER\\SOFTWARE\\DLTools", QSettings::NativeFormat);
onfig_ini_Write->setValue("ProductInfo", temp);
delete Config_ini_Write;
此时只能使用c++自带的注册表方法了
bool AccreditDownloadWidget::writeBinaryToRegistry(const QString& keyPath, const QString& valueName, const QByteArray& data)
{
HKEY hKey;
LONG result = RegOpenKeyEx(HKEY_CURRENT_USER, reinterpret_cast<const wchar_t*>(keyPath.utf16()), 0, KEY_SET_VALUE, &hKey);
if (result != ERROR_SUCCESS)
{
std::cerr << "Failed to open registry key." << std::endl;
return false;
}
result = RegSetValueEx(hKey, reinterpret_cast<const wchar_t*>(valueName.utf16()), 0, REG_BINARY, reinterpret_cast<const BYTE*>(data.constData()), data.size());
if (result != ERROR_SUCCESS)
{
std::cerr << "Failed to set registry value." << std::endl;
RegCloseKey(hKey);
return false;
}
RegCloseKey(hKey);
return true;
}
此时注册表的写入数据为REG_BINARY