C++ 将4字节整数写入char*数组
我有一个给定大小的C++ 将4字节整数写入char*数组,c++,qt,C++,Qt,我有一个给定大小的QByteArray。访问数组的原始数据返回char*,基本上是一个字符数组 我想用uint32\u t值填充QByteArray的整个大小 最安全、最有效的方法是什么?我知道我可以使用Qt函数将数据附加到一个空的QByteArray中,但是这样会在很多时候重新分配内存 我想到了以下实现,但我不确定它是否是最佳解决方案: auto data = QByteArray(fillSize, '0'); auto dataPtr = data.data();
QByteArray
。访问数组的原始数据返回char*
,基本上是一个字符数组
我想用uint32\u t
值填充QByteArray
的整个大小
最安全、最有效的方法是什么?我知道我可以使用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;
}
auto data=QByteArray(fillSize,'0');
auto dataPtr=data.data();
自动填充值=_byteswap_ulong(getFillValue());
for(char*it=dataPtr;it!=dataPtr+fillSize;it+=4)
{
自动帮助=重新解释强制转换(it);
*帮助=填充值;
}
您可以使用QByteArray::reserve(int size)
来避免重新分配。像访问int
数组一样访问char
数组违反了严格的别名规则
除此之外,您的数组可能未对齐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));
}
#包括//尺寸#
#包含//用于int32\u t
#包括//用于memcpy
无效填充(字符*常量arr、大小常量size、int32常量值)无例外{
对于(size_t i=0;i+sizeof(value))来说,您所做的是违反的。这是形式上未定义的行为。但通常是有效的。您也可以使用std::fill\n
来实现这一点:std::fill\n(重新解释强制转换(arr)、fillSize/sizeof(int)、fillValue)
谢谢,这帮了大忙!有没有什么源代码列出了避免UB必须遵守的规则?我想说你应该知道,比如访问你不拥有的内存等等。然后边走边读你使用的函数的文档。好吧,为了完整起见,接下来还有什么额外的安全措施我们考虑endianness?因为这是我以前的一个实现中的一个问题。(我必须更改字节顺序以接收正确的输出。仅供参考:我正在处理稀疏图像。)我猜你必须考虑你使用的解决方案的迂回性与你正在处理的平台的默认连接性。@ ATTIS如果你正在做序列化,你最好做的是使用一个序列化库。否则,只要确保不要序列化为一个字节,并将其进行消毒。跨不同endianness的平台创建d文件。