1
C 언어에서는 printf 및 scanf 함수와 함께 사용할 BYTE, WORD 및 DWORD 데이터 형식에 가장 적합한 형식 지정자는 무엇입니까? BPB 필드의 값을 콘솔에 표시하는 데 어려움을 겪고 있습니다. 예를 들어데이터 유형 BYTE, WORD 및 DWORD에 대한 형식 지정자가 c- 언어로 표시됩니까?
, 내가 BPB_BytsPerSec 내가 이상한 수치를 얻고, "% 루"를 사용하여 표시하려고하면 ..
printf("Bytes per Sector: %lu", b->BPB_BytsPerSec);
나는 믿는다 "514"의 값을 얻고, 잘못 해석. 길을 제안하십시오. 감사. 내가이 표시하려고 통해
/* 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
};
그리고 기능이 :
여기
(I은 64 비트 윈도우를 통해,는 MinGW를 통해 GCC 5.1을 사용하고 있습니다) 우리가 얘기하고있는 구조입니다
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]
}
하고 불행 출력 10
캐스팅은 어떨까요? – MikeCAT
BPB_BytsPerSec은 WORD (unsigned short라고도 함)입니다.이 매크로를 사용하기 위해서는'int '를 사용하십시오. 정수 승격은 32 비트 값으로 만들고 * long *은 컴파일러에서의 32 비트 값이기 때문에 % lu는 끔찍한 잘못이 아닙니다. 그러나 확실히, 514는 맞을 수 없습니다. Off-by-2는 이것이 어떻게 잘못되었는지를 합리적으로 추측하지 않습니다. –
514가 검색되는 이유 : 'b-> BPB_BytsPerSec'에 대한 읽기가 잘못되었거나 구조에 여분의 패딩이있을 수 있습니다 ('BPB_BytesPerSec '앞에 11 바이트가 있고'BPB_BytesPerSec '뒤에는 BPB_SecPerClus가 있습니다. 2 일 수 있습니다. – MikeCAT