将十六进制 QString 转换为 UTF-8 QString
Convert hex QString to UTF-8 QString
在我的项目中,我需要将十六进制 QString ("c2a774657374") 转换为 UTF-8 编码的 QString ("§test")
我当前的函数 (HexToAscii) 确实将十六进制转换为 ascii,但没有正确编码:
void HexToInt(QString num_hex, int &num_int)
{
uint num_uint;
bool ok;
num_uint = num_hex.toUInt(&ok,16);
num_int = (int)num_uint;
}
void HexToAscii(QString &Input)//Input == "c2a774657374"
{
int inputInt;
QString tempInput;
for(int i=0; i<Input.length()/2; i++)
{
HexToInt(Input.mid(i*2, 2), inputInt);
tempInput.append((unsigned char)inputInt);
}
Input = tempInput;//Input == "§test"
}
但是,这只是转换每个字节,并不遵循 UTF-8 编码。
当我希望它是 ("§test")
时,我当前函数的结果是 ("§test")
如何编辑 HexToAscii 函数以转换为 UTF-8 编码的 QString?
谢谢你的时间。
嗯,在 UTF-8 上,最多 127 个是单字节。问题是 QString 如何处理两个字节序列。
QString 无法判断 "c2" 是什么,而是继续分配以等待下一个字节。
您可以通过检查返回的这个十六进制是否大于 127 (7f) 并将它与下一个十六进制连接起来,然后再附加到 QString 来解决这个问题。
尝试:
#include <QCoreApplication>
#include <iostream>
void HexToInt(QString num_hex, int &num_int)
{
uint num_uint;
bool ok;
num_uint = num_hex.toUInt(&ok,16);
num_int = (int)num_uint;
}
QString HexToAscii(QString Input)//Input == "c2a774657374"
{
int inputInt;
int twobytesequece;
QString tempInput;
for(int i=0; i<Input.length()/2; i++)
{
HexToInt(Input.mid(i*2, 2), inputInt);
if (inputInt <= 0x7f) {
tempInput.append((unsigned char)inputInt);
} else {
i++;
HexToInt(Input.mid(i*2, 2), twobytesequece);
inputInt = inputInt << 8 | twobytesequece;
tempInput.append((unsigned char)inputInt);
}
}
return tempInput;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString test = "c2a774657374";
test = HexToAscii(test);
return a.exec();
}
要获取十六进制编码字符串的解码副本,您可以使用 QByteArray::fromHex() 静态函数。
QByteArray hex = QByteArray::fromHex("c2a774657374");
QString str = QString::fromUtf8(hex);
在我的项目中,我需要将十六进制 QString ("c2a774657374") 转换为 UTF-8 编码的 QString ("§test")
我当前的函数 (HexToAscii) 确实将十六进制转换为 ascii,但没有正确编码:
void HexToInt(QString num_hex, int &num_int)
{
uint num_uint;
bool ok;
num_uint = num_hex.toUInt(&ok,16);
num_int = (int)num_uint;
}
void HexToAscii(QString &Input)//Input == "c2a774657374"
{
int inputInt;
QString tempInput;
for(int i=0; i<Input.length()/2; i++)
{
HexToInt(Input.mid(i*2, 2), inputInt);
tempInput.append((unsigned char)inputInt);
}
Input = tempInput;//Input == "§test"
}
但是,这只是转换每个字节,并不遵循 UTF-8 编码。 当我希望它是 ("§test")
时,我当前函数的结果是 ("§test")如何编辑 HexToAscii 函数以转换为 UTF-8 编码的 QString?
谢谢你的时间。
嗯,在 UTF-8 上,最多 127 个是单字节。问题是 QString 如何处理两个字节序列。
QString 无法判断 "c2" 是什么,而是继续分配以等待下一个字节。
您可以通过检查返回的这个十六进制是否大于 127 (7f) 并将它与下一个十六进制连接起来,然后再附加到 QString 来解决这个问题。
尝试:
#include <QCoreApplication>
#include <iostream>
void HexToInt(QString num_hex, int &num_int)
{
uint num_uint;
bool ok;
num_uint = num_hex.toUInt(&ok,16);
num_int = (int)num_uint;
}
QString HexToAscii(QString Input)//Input == "c2a774657374"
{
int inputInt;
int twobytesequece;
QString tempInput;
for(int i=0; i<Input.length()/2; i++)
{
HexToInt(Input.mid(i*2, 2), inputInt);
if (inputInt <= 0x7f) {
tempInput.append((unsigned char)inputInt);
} else {
i++;
HexToInt(Input.mid(i*2, 2), twobytesequece);
inputInt = inputInt << 8 | twobytesequece;
tempInput.append((unsigned char)inputInt);
}
}
return tempInput;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString test = "c2a774657374";
test = HexToAscii(test);
return a.exec();
}
要获取十六进制编码字符串的解码副本,您可以使用 QByteArray::fromHex() 静态函数。
QByteArray hex = QByteArray::fromHex("c2a774657374");
QString str = QString::fromUtf8(hex);