首页 > 解决方案 > 将 4 字节整数写入 char* 数组

问题描述

我有QByteArray一个给定大小的。访问数组的原始数据返回char*,基本上是一个字符数组。

我想用一个值填充QByteArray整个尺寸。uint32_t

最安全、最有效的方法是什么?我知道我可以使用 Qt 函数将数据附加到一个空的 QByteArray 中,但是它会重新分配内存很多时间。

我想到了以下实现,但我不确定它是否是最好的解决方案:

    auto data = QByteArray(fillSize, '0');
    auto dataPtr = data.data();
    auto fillValue = _byteswap_ulong(getFillValue());
    for (char* it = dataPtr; it != dataPtr + fillSize; it += 4)
    {
        auto help = reinterpret_cast<uint32_t*>(it);
        *help = fillValue;
    }

标签: c++qt

解决方案


像访问char数组一样访问数组int违反了严格的别名规则。

除此之外,您的数组可能未对齐int. 未对齐的访问是一个主要问题,因为某些处理器根本无法做到这一点,而其他处理器则可以做到,但速度很慢。这也是未定义的行为。

这是一个没有任何对齐问题或严格混叠问题的版本:

#include <stddef.h>  // for size_t
#include <stdint.h>  // for int32_t
#include <string.h>  // for memcpy

void Fill(char* const arr, size_t const size, int32_t const value) noexcept {
  for (size_t i = 0; i + sizeof(value) <= size; i += sizeof(value))
    memcpy(arr + i, &value, sizeof(value));
}

另请注意,如果您计划存储此数据或通过网络发送数据,CPU 的字节顺序将很重要。


推荐阅读