lhwaizhu 发表于 2012-11-24 21:21:19

请教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给漏掉了呢?请教了 谢谢




jetlib 发表于 2012-11-24 22:01:51

你看一下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:48

说白了就是结构体默认按WORD来对齐,导致结构体内部产生了一些字节padding引起的问题。加上430寻址上的缺陷,所以你的用法有问题。而且,没有什么太好的方法。

lhwaizhu 发表于 2012-11-24 22:34:44

jetlib 发表于 2012-11-24 22:03 static/image/common/back.gif
说白了就是结构体默认按WORD来对齐,导致结构体内部产生了一些字节padding引起的问题。加上430寻址上的缺陷 ...

谢谢了,430学的不够仔细啊...
页: [1]
查看完整版本: 请教C语言数据转换