amobbs.com 阿莫电子技术论坛

标题: 请教C语言数据转换 [打印本页]

作者: lhwaizhu    时间: 2012-11-24 21:21
标题: 请教C语言数据转换
在IAR环境中:
#define  uint8    unsigned char
#define  uint16   unsigned int
#define  uint32   unsigned long int

unsigned char BUFFER[512]; //存放数据

typedef struct  //这里一共是512个字节
{
        uint8 BS_jmpBoot[3];
        uint8 BS_OEMName[8];
        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[11];
        uint8 BS_FilSysType[8];
        uint8 ExecutableCode[448];
        uint8 ExecutableMarker[2];
} FAT_BPB;


FAT_BPB* BPB;

当我读出了512字节存放到BUFFER中后  BPB = (FAT_BPB*)BUFFER; 查看BPB中的数据发现       
uint8 BS_jmpBoot[3];
uint8 BS_OEMName[8]; 这11个数据正常,
BUFFER[11]=0x00;
BUFFER[12]=0x02;
BUFFER[13]=0x40;
转换过去     BPB_BytesPerSec=0x4002 我感觉应该是0x0200才对啊,编译器怎么会把BUFFER[11]给漏掉了呢?请教了 谢谢





作者: jetlib    时间: 2012-11-24 22:01
你看一下sizeof(FAT_BPB),真的是512字节大小么?
这种方法:
#pragma pack(1)
typedef struct
{
   XXX xxx
}FAT_PBP
倒是可以将该结构体弄成512字节,但是按你的赋值/寻址方式,会导致对该结构体内的某些UINT16字访问错误,因为430要求对16位变量寻址时,其低位地址必须是0,如果不是,会强制付成0,这是430单片机寻址上比较恶心的不足。所以,还是考虑别的使用方法吧。
作者: jetlib    时间: 2012-11-24 22:03
说白了就是结构体默认按WORD来对齐,导致结构体内部产生了一些字节padding引起的问题。加上430寻址上的缺陷,所以你的用法有问题。而且,没有什么太好的方法。
作者: lhwaizhu    时间: 2012-11-24 22:34
jetlib 发表于 2012-11-24 22:03
说白了就是结构体默认按WORD来对齐,导致结构体内部产生了一些字节padding引起的问题。加上430寻址上的缺陷 ...

谢谢了,430学的不够仔细啊...




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4