【问题标题】:Replace method changes size of QByteArrayReplace 方法改变 QByteArray 的大小
【发布时间】:2014-06-15 06:49:13
【问题描述】:

我想操作一个存储在 QByteArray 中的 32 位写入命令。但让我感到困惑的是我的 QByteArray 改变了大小,我无法弄清楚为什么会发生这种情况。

我的代码:

const char CMREFCTL[] = {0x85,0x00,0x00,0x0B};
QByteArray test = QByteArray::fromRawData(CMREFCTL, sizeof(CMREFCTL));

qDebug()<<test.toHex();

const char last1 = 0x0B;
const char last2 = 0x0A;

test.replace(3,1,&last2);
qDebug()<<test.toHex();
test.replace(3,1,&last1);
qDebug()<<test.toHex();

生成:

"0x8500000b"
"0x8500000a0ba86789"
"0x8500000ba867890ba86789"

我希望得到以下输出:

"0x8500000b"
"0x8500000a"
"0x8500000b"

使用 test.replace(3,1,&last2,1) 有效,但我不明白为什么上面的代码没有给出相同的结果。

最好的问候!

【问题讨论】:

    标签: c++ qt qbytearray


    【解决方案1】:

    这里是相关方法的文档:

    QByteArray & QByteArray::replace ( int pos, int len, const char * 之后)

    这是一个重载函数。

    将索引位置 pos 的 len 个字节替换为以零结尾 后面的字符串。

    注意:这可以改变字节数组的长度。

    你不是给字节数组一个以零结尾的字符串,而是一个指向单个字符的指针。所以它会从那个指针开始在内存中向前扫描,直到它到达 0,然后把所有的内存当作要替换的字符串。

    如果你只想改变一个字符test[3] = last2;应该做你想做的事。

    【讨论】:

    • 我会注意到这会导致未定义的行为,因此它可能同样容易崩溃
    • 有没有办法解决这个问题?我将浮点数存储在点云的QByteArray 中,每当我在这个容器上操作时,即一个向每个 X 坐标添加值的函数,容器都会增长。我最后打电话给QByteArray::resize(),但这似乎效率低下。也许我应该从头开始构建一个QByteArray,而不是在我原来的QByteArray 的副本上调用replace()
    猜你喜欢
    • 2018-02-25
    • 1970-01-01
    • 2016-07-07
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多