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