请教C语言数据转换
在IAR环境中:#defineuint8 unsigned char
#defineuint16 unsigned int
#defineuint32 unsigned long int
unsigned char BUFFER; //存放数据
typedef struct//这里一共是512个字节
{
uint8 BS_jmpBoot;
uint8 BS_OEMName;
uint16 BPB_BytesPerSec;
uint8 BPB_SecPerClus;
uint16 BPB_RsvdSecCnt;
uint8 BPB_NumFATs;
uint16 BPB_RootEntCnt;
uint16 BPB_TotSec16;
uint8 BPB_Media;
uint16 BPB_FATSz16;
uint16 BPB_SecPerTrk;
uint16 BPB_NumHeads;
uint32 BPB_HiddSec;
uint32 BPB_TotSec32;
uint8 BS_DrvNum;
uint8 BS_Reservedl;
uint8 BS_BootSig;
uint32 BS_VolID;
uint8 BS_VolLab;
uint8 BS_FilSysType;
uint8 ExecutableCode;
uint8 ExecutableMarker;
} FAT_BPB;
FAT_BPB* BPB;
当我读出了512字节存放到BUFFER中后BPB = (FAT_BPB*)BUFFER; 查看BPB中的数据发现
uint8 BS_jmpBoot;
uint8 BS_OEMName; 这11个数据正常,
BUFFER=0x00;
BUFFER=0x02;
BUFFER=0x40;
转换过去 BPB_BytesPerSec=0x4002 我感觉应该是0x0200才对啊,编译器怎么会把BUFFER给漏掉了呢?请教了 谢谢
你看一下sizeof(FAT_BPB),真的是512字节大小么?
这种方法:
#pragma pack(1)
typedef struct
{
XXX xxx
}FAT_PBP
倒是可以将该结构体弄成512字节,但是按你的赋值/寻址方式,会导致对该结构体内的某些UINT16字访问错误,因为430要求对16位变量寻址时,其低位地址必须是0,如果不是,会强制付成0,这是430单片机寻址上比较恶心的不足。所以,还是考虑别的使用方法吧。 说白了就是结构体默认按WORD来对齐,导致结构体内部产生了一些字节padding引起的问题。加上430寻址上的缺陷,所以你的用法有问题。而且,没有什么太好的方法。 jetlib 发表于 2012-11-24 22:03 static/image/common/back.gif
说白了就是结构体默认按WORD来对齐,导致结构体内部产生了一些字节padding引起的问题。加上430寻址上的缺陷 ...
谢谢了,430学的不够仔细啊...
页:
[1]