【问题标题】:Format specifiers for data type BYTE, WORD and DWORD in c-language?c语言中数据类型BYTE,WORD和DWORD的格式说明符?
【发布时间】:2016-11-12 00:54:28
【问题描述】:

在 C 语言中,与 printf 和 scanf 函数一起使用的数据类型 BYTE、WORD 和 DWORD 最合适的格式说明符是什么? 我很难通过控制台显示 BPB 字段的值。

例如,如果我尝试使用“%lu”显示 BPB_BytesPerSec,我会得到不寻常的数字。..

printf("Bytes per Sector: %lu", b->BPB_BytsPerSec);

我得到的值是“514”,我认为这是错误的解释。请提出出路。谢谢。

(我在 64 位 Windows 上通过 MinGW 使用 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]
}

这是不愉快的输出:

【问题讨论】:

  • 选角怎么样? printf("%"PRIu16, (uint16_t)b-&gt;BPB_BytsPerSec);(包括 inttypes.h 以使用这些宏)
  • BPB_BytsPerSec 是一个 WORD(又名无符号短)。整数提升使其成为 32 位值,并且 long 在您的编译器上肯定也是 32 位值,因此 %lu 并没有大错特错。但可以肯定的是,514 不可能是正确的。 Off-by-2 无法合理猜测这是怎么出错的。
  • 为什么检索到 514:b-&gt;BPB_BytsPerSec 读取的位置可能是错误的,或者结构中可能有额外的填充(BPB_BytesPerSec 之前有 11 个字节,BPB_BytesPerSec 之后是 @ 987654331@,可能是2)。
  • 请也发布结构。为什么每个扇区的磁盘字节数是long?你期待什么数字?什么是字节序?
  • 不,字节序不适用于字符数组,它适用于整数类型。始终假设,对于外部提供的数据,您可能存在字节顺序问题。前 3 个字节是正确的并不是说您不需要将其设为 packed 结构。如果你要否认答案,你为什么要问一个问题?

标签: c filesystems format-specifiers fat32 fat


【解决方案1】:
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef unsigned long long QWORD;

【讨论】:

    猜你喜欢
    • 2016-02-13
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2012-10-06
    • 2015-12-08
    • 1970-01-01
    相关资源
    最近更新 更多