c语言中数据类型字节、字和DWORD的格式说明符?
在C语言中,与printf和scanf函数一起使用的数据类型BYTE、WORD和DWORD的最合适的格式说明符是什么? 我很难在控制台上显示BPB字段的值 例如,如果我试图使用“%lu”显示BPB_BytsPerSec,我会得到不寻常的数字c语言中数据类型字节、字和DWORD的格式说明符?,c,filesystems,format-specifiers,fat32,fat,C,Filesystems,Format Specifiers,Fat32,Fat,在C语言中,与printf和scanf函数一起使用的数据类型BYTE、WORD和DWORD的最合适的格式说明符是什么? 我很难在控制台上显示BPB字段的值 例如,如果我试图使用“%lu”显示BPB_BytsPerSec,我会得到不寻常的数字 printf("Bytes per Sector: %lu", b->BPB_BytsPerSec); 我得到的值是“514”,我认为这是错误的解释。。请建议出路。谢谢 (我通过MinGW在64位Windows上使用gcc 5.1) 以下是我们正在讨
printf("Bytes per Sector: %lu", b->BPB_BytsPerSec);
我得到的值是“514”,我认为这是错误的解释。。请建议出路。谢谢
(我通过MinGW在64位Windows上使用gcc 5.1)
以下是我们正在讨论的结构:
/* BPB Structure Collected from internet */
struct BPB_FAT32 {
BYTE BS_jmpBoot[3]; // 0
BYTE BS_OEMName[8]; // 3
WORD BPB_BytsPerSec; // 11
BYTE BPB_SecPerClus; // 13
WORD BPB_ResvdSecCnt; // 14
BYTE BPB_NumFATs; // 16
WORD BPB_RootEntCnt; // 17
WORD BPB_TotSec16; // 19
BYTE BPB_Media; // 21
WORD BPB_FATSz16; // 22
WORD BPB_SecPerTrk; // 24
WORD BPB_NumHeads; // 26
DWORD BPB_HiddSec; // 28
DWORD BPB_TotSec32; // 32
DWORD BPB_FATSz32; // 36
WORD BPB_ExtFlags; // 40
WORD BPB_FSVer; // 42
DWORD BPB_RootClus; // 44
WORD BPB_FSInfo; // 48
WORD BPB_BkBootSec; // 50
BYTE BPB_Reserved[12]; // 52
BYTE BS_DrvNum; // 64
BYTE BS_Reserved1; // 65
BYTE BS_BootSig; // 66
DWORD BS_VolID; // 67
BYTE BS_VolLab[11]; // 71
BYTE BS_FilSysType[8]; // 82
};
这就是我用来显示这些值的函数
void DisplayBlock(struct BPB_FAT32* b){
printf("\n\n\t1. Jump to boot code..........: 0x%02x%02x%02x",b->BS_jmpBoot[0],b->BS_jmpBoot[1],b->BS_jmpBoot[2]);
printf("\n\n\t2. OEM name & version.........: "); for(int i=0; i<8;i++) printf("%c",(char)b->BS_OEMName[i]);
printf("\n\n\t3. Bytes per Sector...........: %u",b->BPB_BytsPerSec); // WORD
printf("\n\n\t4. Sectors per Cluster........: %lu", b->BPB_SecPerClus); // BYTE
printf("\n\n\t5. Reserved Sectors Count.....: %lu", b->BPB_ResvdSecCnt); // WORD
printf("\n\n\t6. Number of FAT32 tables.....: %u", b->BPB_NumFATs); // BYTE
printf("\n\n\t7. Number of Root Entries.....: %lu", b->BPB_RootEntCnt); // WORD
printf("\n\n\t8. Total Sectors 16bits.......: %lu",b->BPB_TotSec16); // WORD
printf("\n\n\t9. Media Descriptor...........: %lu",b->BPB_Media); // BYTE 0xF8 is the standard value for fixed media
printf("\n\n\t10. Size According to FAT16....: %lu",b->BPB_FATSz16); // WORD
printf("\n\n\t11. Number of Sector per Track.: %lu",b->BPB_SecPerTrk); // WORD
printf("\n\n\t12. Number of Heads............: %lu",b->BPB_NumHeads); // WORD
printf("\n\n\t13. Number of Hidden Sectors...: %lu", b->BPB_HiddSec); // DWORD
printf("\n\n\t14. Total Sectors 32bits.......: %lu", b->BPB_TotSec32); // DWORD
/* FAT32 Specific Fields Starting offset:36 */
printf("\n\n\t15. Size According to FAT32....: %lu", b->BPB_FATSz32); // DWORD
//printf("\n\n\t16. Extended Flags............: %u",b->BPB_ExtFlags); // WORD Usually 0.
printf("\n\n\t17. File System Version........: %lu", b->BPB_FSVer); // WORD Must be 0:0
printf("\n\n\t18. Root Cluster Number........: %lu",b->BPB_RootClus); // DWORD Usually 2
printf("\n\n\t19. File System Information....: %lu",b->BPB_FSInfo); // WORD
printf("\n\n\t20. Backup Boot Sector.........: %lu",b->BPB_BkBootSec); // WORD Recomended 6
// BYTE BPB_Reserved[12]
/* Remaining common fields FAT12/FAT16 BPB*/
printf("\n\n\t21. Drive Number...............: %u",b->BS_DrvNum); // BYTE
// BYTE BS_Reserved1; /* 65 reserved */
printf("\n\n\t22. Boot Signature.............: %u",b->BS_BootSig); // BYTE
printf("\n\n\t23. Volume ID..................: %lu",b->BS_VolID); // DWORD
printf("\n\n\t24. Volume Lable...............: %s",b->BS_VolLab); //for(int i=0;i<11;i++) printf("%c",b->BS_VolLab[i]); // BYTE [11]
printf("\n\n\t25. File System Type...........: "); for(int i=0;i<8;i++) printf("%c",b->BS_FilSysType[i]); // BYTE [8]
}
void DisplayBlock(结构BPB_FAT32*b){
printf(“\n\n\t1.跳转到启动代码………..:0x%02x%02x%02x”,b->BS_jmpBoot[0],b->BS_jmpBoot[1],b->BS_jmpBoot[2]);
printf(“\n\n\t2.OEM名称和版本…………”;for(int i=0;iBS_OEMName[i]);
printf(“\n\n\t3.每个扇区的字节数……….:%u”,b->BPB_BytsPerSec);//WORD
printf(“\n\n\t4.每个集群的扇区数…….:%lu”,b->BPB_SecPerClus);//字节
printf(“\n\n\t5.保留扇区计数…:%lu”,b->BPB\u ResvdSecCnt);//WORD
printf(“\n\n\t6.FAT32表的数量…:%u”,b->BPB\u NumFATs);//字节
printf(“\n\n\t7.根条目数…:%lu”,b->BPB\u RootEntCnt);//WORD
printf(“\n\n\t8.总扇区16位……:%lu”,b->BPB_TotSec16);//字
printf(“\n\n\t9.媒体描述符……….:%lu”,b->BPB_媒体);//字节0xF8是固定媒体的标准值
printf(“\n\n\t10.根据FAT16的大小….:%lu”,b->BPB_FATSz16);//WORD
printf(“\n\n\t11.每条音轨的扇区数:%lu”,b->BPB\u SecPerTrk);//WORD
printf(“\n\n\t12.磁头数…………:%lu”,b->BPB\u NumHeads);//WORD
printf(“\n\n\t13.隐藏扇区数…:%lu”,b->BPB_HiddSec);//DWORD
printf(“\n\n\t14.总扇区32位……:%lu”,b->BPB_TotSec32);//DWORD
/*FAT32特定字段起始偏移量:36*/
printf(“\n\n\t15.根据FAT32的大小….:%lu”,b->BPB_FATSz32);//DWORD
//printf(“\n\n\t16.扩展标志…………:%u”,b->BPB_ExtFlags);//单词通常为0。
printf(“\n\n\t17.文件系统版本……。:%lu”,b->BPB\u FSVer);//WORD必须为0:0
printf(“\n\n\t18.根群集编号…….:%lu”,b->BPB_RootClus);//DWORD通常为2
printf(“\n\n\t19.文件系统信息….:%lu”,b->BPB_FSInfo);//WORD
printf(“\n\n\t20.备份引导扇区………:%lu”,b->BPB\u BkBootSec);//WORD推荐6
//字节BPB_保留[12]
/*剩余通用字段FAT12/FAT16 BPB*/
printf(“\n\n\t21.驱动器号…………:%u”,b->b\u DrvNum);//字节
//字节BS_Reserved1;/*65 reserved*/
printf(“\n\n\t22.引导签名…………:%u”,b->BS\u BootSig);//字节
printf(“\n\n\t23.Volume-ID…………:%lu”,b->BS\u-VolID);//DWORD
printf(“\n\n\t24.卷标签…………:%s”,b->b_VolLab);//for(int i=0;iBS_VolLab[i])//字节[11]
printf(“\n\n\t25.文件系统类型……….:”);for(int i=0;iBS_FilSysType[i])//字节[8]
}
以下是令人不快的结果:
铸造怎么样<代码>printf(“%”PRIu16,(uint16_t)b->BPB_BytsPerSec)(包括
inttypes.h
使用这些宏)BPB_BytsPerSec是一个单词(又称无符号短)。整数提升使其成为32位值,而long在编译器上也肯定是32位值,因此%lu的错误并不严重。但514肯定不对。Off-by-2并没有留下一个合理的猜测这是如何出错的。为什么要检索514:Where is read forb->BPB_bytsperec
可能是错误的,或者结构中可能有额外的填充(在BPB_bytespercc
之前有11个字节,在BPB_bytespercc
之后是BPB_SecPerClus
,可能是2).请把结构也贴出来。为什么每个扇区的磁盘字节都是长的
?你在等什么号码?什么是endianness?不,endianness不适用于字符数组,它适用于整数类型。始终假设,对于外部提供的数据,您可能会遇到端点问题。正确的前3个字节并不是说不需要将其设置为压缩结构。如果你要否认答案,为什么还要问一个问题?
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef unsigned long long QWORD;