【问题标题】:Swapping bytes in a QByteArray交换 QByteArray 中的字节
【发布时间】:2013-05-24 19:50:36
【问题描述】:

我想编写一个简单的函数来交换QByteArray 中的字节。这是我想出的:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString t = "abcde";
    QByteArray test;
    test.append(t.at(0));
    test.append(t.at(1));
    test.append(t.at(2));
    test.append(t.at(3));
    test.append(t.at(4));

    qDebug() <<  t;
    qDebug() << QString(swapBytes(test,0,3));

    return a.exec();
}

QByteArray swapBytes(QByteArray in, int swapOffset, int quantity) {
    if (swapOffset < 0) {
        return in;
    }
    if(quantity>(in.length()/2)) {quantity=in.length()/2;}
    if(quantity < 1) {quantity=1;}
    int k;
    char buf[quantity];
    char buf2[quantity];
    qDebug() << quantity;
    for (int i = 0; i + quantity*2 + swapOffset <= in.length(); i=i+2*quantity) {
        k=i;
        for(int b = 0;b<i+quantity;b++){
            buf[b]=in.at(k);
            buf2[b]=in.at(k+swapOffset+quantity);
            k++;
        }
        qDebug() << buf;
        qDebug() << buf2;
        qDebug() << in;
        in.replace(0,quantity,buf2);
        qDebug() << in;
        in.replace(quantity+swapOffset,quantity,buf);
    }
    return in;
}

由于某种原因,当我运行此代码时,我得到以下输出:

abcde
ab(
cd
abcde
cdcde
cdab(e

括号从何而来?据我所知,每个字节只有一个字符,那么有什么问题?

【问题讨论】:

  • 在声明它们之后尝试添加memset(buf, 'z', quantity); memset(buf2, 'z', quantity);
  • 添加后memset(buf, 'z', quantity); memset(buf2, 'z', 数量);我得到了同样的结果。

标签: c++ qt


【解决方案1】:

您需要比quantity 多分配一个字节,以便为空终止符留出空间。试试这个:

char* buf = new char[quantity+1];
char* buf2 = new char[quantity+1];
memset(buf, 0, quantity+1);
memset(buf2, 0, quantity+2);

那么在你的函数返回之前,记得解除分配:

delete [] buf;
delete [] buf2;
return in;

或者,您可以使用 QByteArray 代替 char 数组:

QByteArray buf(quantity, 0x00);
QByteArray buf2(quantity, 0x00);

这使您可以跳过对memset 的调用并避免担心释放问题。

与所有这些无关,请注意,您可以像这样从 QString 初始化 QByteArray

QByteArray test = t.toAscii();

【讨论】:

    猜你喜欢
    • 2013-06-02
    • 2013-10-08
    • 2013-07-14
    • 2014-04-25
    • 1970-01-01
    • 2014-07-29
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多