我编写了一个函数来将一些二进制数据的十六进制字符串表示(如 x00)转换为数据本身。
如何改进这段代码?
QByteArray restoreData(const QByteArray &data, const QString prepender = "x")
{
QByteArray restoredData = data;
return QByteArray::fromHex(restoredData.replace(prepender, ""));
}
我编写了一个函数来将一些二进制数据的十六进制字符串表示(如 x00)转换为数据本身。
如何改进这段代码?
QByteArray restoreData(const QByteArray &data, const QString prepender = "x")
{
QByteArray restoredData = data;
return QByteArray::fromHex(restoredData.replace(prepender, ""));
}
如何改进这段代码?
在优化之前进行基准测试。不要过早优化。
超越要点:为什么要优化它?
1)如果你真的很关心性能,从性能的角度来看,这个微不足道的代码很重要,那么你首先不会使用 Qt,因为与优化良好的框架相比,Qt 天生就很慢。
2)如果您不那么关心性能,那么您应该牢记可读性和维护性作为主要原则,在这种情况下您的代码就可以了。
您还没有展示任何真实世界的示例,或者您为什么要优化。这对我来说感觉像是一个没有太多实际用途的学术问题。了解更多关于动机的信息会很有趣。
话虽如此,也可以在您的代码中完成一些改进项目,也就是优化,但话又说回来:它不是为了优化而做的,而更像是逻辑原因。
1) Prepender 是坏名声;它通常在英语中称为“前缀”。
2)您希望使用 QChar 而不是 QString 作为字符。
3) 同样,对于替换,您希望使用 '' 而不是字符串'ish "" 公式。
4)即使它是CoW(隐式共享),我也会通过引用而不是值语义来传递类似的类。
5)我什至不会在这里为前缀使用参数,因为它总是相同的,所以它并不真正符合变量的定义。
6) 无需显式创建临时变量。
7) 使函数内联。
因此,您将编写如下内容:
QByteArray restoreData(QByteArray data)
{
return QByteArray::fromHex(data.replace('x', ''));
}
您的代码存在性能问题,因为replace()
. 替换本身并不是很快,并且创建中间QByteArray
对象会进一步减慢代码速度。如果您真的关心性能,您可以QByteArray::fromHex
从 Qt 源代码中复制实现并根据需要对其进行修改。幸运的是,它的实现是相当独立的。我只更改/ 2
并/ 3
添加了--i
行以跳过“x”字符。
QByteArray myFromHex(const QByteArray &hexEncoded)
{
QByteArray res((hexEncoded.size() + 1)/ 3, Qt::Uninitialized);
uchar *result = (uchar *)res.data() + res.size();
bool odd_digit = true;
for (int i = hexEncoded.size() - 1; i >= 0; --i) {
int ch = hexEncoded.at(i);
int tmp;
if (ch >= '0' && ch <= '9')
tmp = ch - '0';
else if (ch >= 'a' && ch <= 'f')
tmp = ch - 'a' + 10;
else if (ch >= 'A' && ch <= 'F')
tmp = ch - 'A' + 10;
else
continue;
if (odd_digit) {
--result;
*result = tmp;
odd_digit = false;
} else {
*result |= tmp << 4;
odd_digit = true;
--i;
}
}
res.remove(0, result - (const uchar *)res.constData());
return res;
}
测试:
qDebug() << QByteArray::fromHex("54455354"); // => "TEST"
qDebug() << myFromHex("x54x45x53x54"); // => "TEST"
此代码在hexEncoded
格式错误时可能会出现意外行为(例如“x54x45x5”将转换为“TU”)。如果有问题,您可以以某种方式解决此问题。