无符号字符数组的十六进制 QString 表示
Hexadecimal QString representation to Unsigned char array
带有一些用户输入的 QString 包含一个 MAC 地址,例如 "68F542F9AB22"
。我需要将 QString 转换为数字的无符号字符数组 [6],而不是 ASCII 表示形式。所以对于 QString 68F542F9AB22
,第一个位置的 unsigned char 数组应该是 104。
您可以遍历您的 QString 并将其分成两部分,然后使用 QString::toUShort(&ok,16),这将为您提供一个 ushort 的十六进制字符串。
有点像
for(int i=0;i<6;++i)
{
QString hexString = yourstring.mid(i*2,2);
bool ok = false;
yourBuf[i] = (unsigned char) hexString.toUShort(&ok,16);
//if not ok, handle error
}
您应该检查输入字符串的长度是否正确,并对转换错误进行一些错误处理。
希望这对您有所帮助。
我会按以下方式进行:
QString s("68F542F9AB22");
assert(s.size() % 2 == 0);
std::vector<unsigned char> array;
for (int i = 0; i < s.size(); i += 2)
{
QString num = s.mid(i, 2);
bool ok = false;
array.push_back(num.toUInt(&ok, 16));
assert(ok);
}
你可以试试:
QString s = "68F542F9AB22";
unsigned char array[6];
if (s.length() % 2 == 0) { // test string length is even
for (unsigned long i = 0 ; i < s.length() ; i += 2) {
QString chunk = s.mid(i,2);
bool ok;
array[i/2] = static_cast<unsigned char>(chunk.toInt(&ok,16));
}
}
请注意,以上代码仅适用于偶数字符串(但对于 MAC 地址,没问题)。
要测试结果,您可以使用:
for (unsigned long i = 0 ; i < 6 ; i ++) {
std::cout<<"Array ["<<i<<"] = "<<static_cast<unsigned long>(array[i])<<std::endl;
}
Hex 到 long long
是一个单一的操作,最多可以转换 64 位。这对于 48 位 MAC 来说已经足够了。所以:
bool ok = false;
auto result = input.toULongLong(&ok,16);
for(int i=5;i>=0;--i)
{
buf[i] = result & 0xFF;
result >>= 8;
}
带有一些用户输入的 QString 包含一个 MAC 地址,例如 "68F542F9AB22"
。我需要将 QString 转换为数字的无符号字符数组 [6],而不是 ASCII 表示形式。所以对于 QString 68F542F9AB22
,第一个位置的 unsigned char 数组应该是 104。
您可以遍历您的 QString 并将其分成两部分,然后使用 QString::toUShort(&ok,16),这将为您提供一个 ushort 的十六进制字符串。
有点像
for(int i=0;i<6;++i)
{
QString hexString = yourstring.mid(i*2,2);
bool ok = false;
yourBuf[i] = (unsigned char) hexString.toUShort(&ok,16);
//if not ok, handle error
}
您应该检查输入字符串的长度是否正确,并对转换错误进行一些错误处理。
希望这对您有所帮助。
我会按以下方式进行:
QString s("68F542F9AB22");
assert(s.size() % 2 == 0);
std::vector<unsigned char> array;
for (int i = 0; i < s.size(); i += 2)
{
QString num = s.mid(i, 2);
bool ok = false;
array.push_back(num.toUInt(&ok, 16));
assert(ok);
}
你可以试试:
QString s = "68F542F9AB22";
unsigned char array[6];
if (s.length() % 2 == 0) { // test string length is even
for (unsigned long i = 0 ; i < s.length() ; i += 2) {
QString chunk = s.mid(i,2);
bool ok;
array[i/2] = static_cast<unsigned char>(chunk.toInt(&ok,16));
}
}
请注意,以上代码仅适用于偶数字符串(但对于 MAC 地址,没问题)。
要测试结果,您可以使用:
for (unsigned long i = 0 ; i < 6 ; i ++) {
std::cout<<"Array ["<<i<<"] = "<<static_cast<unsigned long>(array[i])<<std::endl;
}
Hex 到 long long
是一个单一的操作,最多可以转换 64 位。这对于 48 位 MAC 来说已经足够了。所以:
bool ok = false;
auto result = input.toULongLong(&ok,16);
for(int i=5;i>=0;--i)
{
buf[i] = result & 0xFF;
result >>= 8;
}