Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c语言中数据类型字节、字和DWORD的格式说明符?_C_Filesystems_Format Specifiers_Fat32_Fat - Fatal编程技术网

c语言中数据类型字节、字和DWORD的格式说明符?

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) 以下是我们正在讨

在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)

以下是我们正在讨论的结构:

/* 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 for
b->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;