繁体   English   中英

struct中的uint32_t无法正常工作

[英]uint32_t in struct not working as expected

我正在尝试使用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_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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM