gpt4 book ai didi

c++ - 结构中的 uint32_t 未按预期工作

转载 作者:行者123 更新时间:2023-11-30 03:18:52 30 4
gpt4 key购买 nike

我正在尝试使用 struct 读取位图文件的 header ,但 uint32_t 成员不包含预期值。

文件的开头包含以下数据:424d 36e6 0100 0000

最小示例:

#include <SPI.h>
#include <SD.h>

File myFile;

struct s1 {
uint16_t v16;
uint32_t v32;
};
s1 structvar;

struct s2 {
uint16_t v16_1;
uint16_t v16_2;
uint16_t v16_3;
};
s2 structvar2;

uint16_t v16;
uint32_t v32;

void setup() {
Serial.begin(9600);

Serial.print("Initializing SD card...");

if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");

myFile = SD.open("IMAGE001.BMP", FILE_READ);
if (myFile) {
Serial.println("Struct1");
myFile.read(&structvar,6);
Serial.println(structvar.v16);
Serial.println(structvar.v32);

myFile.seek(0);
Serial.println("Struct2");
myFile.read(&structvar2,6);
Serial.println(structvar2.v16_1);
Serial.println(structvar2.v16_2);
Serial.println(structvar2.v16_3);

myFile.seek(0);
Serial.println("Separate vars");
myFile.read(&v16,2);
myFile.read(&v32,4);
Serial.println(v16);
Serial.println(v32);

myFile.close();
}
}

void loop() {
// nothing happens after setup finishes.
delay(100);
}

输出:

Struct1
19778 //0x4d42
1 //0x00000001 - Lower half only
4 //4 Bytes - correct size.

Struct2
19778 //0x4d42
58934 //0xe636 - Upper Half
1 //0x0001 - Lower Half

Separate vars
19778 //0x4d42
124470 //0x0001e636 - Correct

因此,看起来结构的 uint_32_t 成员仅包含(小端)数据的下半部分,而如果我将 uint_32_t 读取为 2x uint16_t,或者如果我分别读取 uint16_tuint32_t 值,那么它们包含正确的数据

我错过了什么?这跟打包有关系吗?

最佳答案

很可能您的对齐优化影响了您的代码。你应该使用这样的东西

#pragma pack(push, 1) // one byte alignment
struct s1 {
uint16_t v16;
uint32_t v32;
};
struct s2 {
uint16_t v16_1;
uint16_t v16_2;
uint16_t v16_3;
};
#pragma pack(pop)

你也可以像下面那样改进阅读,而不是手动完成所有事情

myFile.read(&structvar2, sizeof(structvar2));

关于c++ - 结构中的 uint32_t 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54280655/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com