Converting data types to add to QByteArray for writing raw data to file
我有一些数据类型要写入原始数据文件。我没有使用 QDataStream 因为它会写入一些关于数据的额外信息,比如数据的长度和顺序。我只是想要一个仅包含我写入的字节的文件,并且只会由知道正在写入的数据类型的正确顺序和大小的人解释。
我正在使用 QFile,写入方法 qint64 QIODevice::write(const QByteArray &byteArray).
我有几个 uint8_t、uint32_t 和浮点数要写入文件。如何将此数据转换为没有额外字节的 QByteArray?
这是我目前所拥有的:
1
2 3 4 5 6 7 8 |
void FileWriter::writeData(uint8_t status, uint8_t channel, uint32_t ticks, float source0, float source1){
QByteArray dataToWrite; //some code to add the paramters to the dataToWrite array this–>file.write(dataToWrite); |
将常规旧样式强制转换为 char 会给我一个 implicit conversion changes signedness 错误,因此无法正确存储该值。
将这些值复制到 QByteArray 以便我可以将其写入文件的正确方法是什么?
通常,您希望序列化数据流,同时注意数据的字节顺序。
uint8_t 变量可以通过简单的 static_cast 转换为字节。对于较大的整数类型,您需要跟踪数据的字节顺序,并逐字节推送。
float 数据类型有点棘手。您首先需要将浮点数的位表示为整数值 (uint32_t),然后从那里进行序列化。示例如下:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
QByteArray data;
//serialize a uint8_t //serialize a uint32_t, little-endian //serialize a float, by first representing the bits as a uint32_t: static_assert(sizeof(float) == sizeof(uint32_t),“Floats should be 4 bytes”); this–>file.write(data); |
需要记住的几点:
数据的字节顺序很重要。并非所有系统都具有相同的字节顺序,因此您需要在文档中明确说明字节的定向方式。
有些人试图通过编写 uint32_t rep = *reinterpret_cast<uint32_t*>(&source0); 之类的东西来将 float 的位转换为 uint32_t。不要这样做——这违反了严格别名规则。
将版本号序列化为文件的第一部分可能是个好主意,这样您以后可以对数据格式进行更改并使其向后兼容。
很多这种手动位打包可以写入模板函数,自动完成。这留给读者作为练习。
如果性能很重要,您应该在推送之前弄清楚数据的大小和字节数组中的空间 reserve() ——这将使数组不必重新分配和一遍又一遍地增长。
- 谢谢你。到目前为止,该应用程序只能在一个平台上运行,因此字节序目前并不是非常重要。这是完美的,正是我想要的。我不太熟悉 C 的低级机制,所以这对我来说是一个学习练习。谢谢!
来源:https://www.codenong.com/53090332/