3

我编写了一个函数来将一些二进制数据的十六进制字符串表示(如 x00)转换为数据本身。

如何改进这段代码?

QByteArray restoreData(const QByteArray &data, const QString prepender = "x")
{
    QByteArray restoredData = data;

    return QByteArray::fromHex(restoredData.replace(prepender, ""));
}
4

2 回答 2

1

如何改进这段代码?

在优化之前进行基准测试。不要过早优化。

超越要点:为什么要优化它?

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', ''));
}
于 2014-05-24T10:35:52.217 回答
1

您的代码存在性能问题,因为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”)。如果有问题,您可以以某种方式解决此问题。

于 2014-05-24T09:50:21.650 回答