我正在尝试使用struct
来读取位图文件的标题,但是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
成员仅包含(little-endian)数据的下半部分,而如果我将uint_32_t
读为2x uint16_t
,或者如果我分别读取uint16_t
和uint32_t
值,那么它们包含正确的数据
我想念什么?这和包装有关吗?
答案 0 :(得分:2)
最有可能您进行的对齐优化影响了您的代码。你应该使用这样的东西
#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));