2016-07-09 9 views
1

Was sind in C-Sprache die am besten geeigneten Formatbezeichner für den Datentyp BYTE, WORD und DWORD, die mit den Funktionen printf und scanf verwendet werden? Es fällt mir schwer, die Werte des BPB-Feldes über der Konsole anzuzeigen.Formatbezeichner für Datentyp BYTE, WORD und DWORD in C-Sprache?

Zum Beispiel, wenn ich versuche, BPB_BytsPerSec mit „% lu“ anzuzeigen, ich ungewöhnlichsten Zahlen bin immer ..

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

ich einen Wert von „514“ bekommen, was ich glaube, ist falsch Interpretation .. Bitte schlagen Sie den Ausweg vor. Vielen Dank.

(Ich bin mit gcc 5.1 über MinGW, die über einen 64-Bit-Windows)

Hier ist die Struktur, die wir reden:

/* 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 
}; 

Und die Funktion, durch die ich diese anzuzeigen versuche Werte ..

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] 
} 

Und hier ist der unglückliche Ausgang: a Sample output

+1

Wie wäre es mit Gießen? 'printf ("% "PRIu16, (uint16_t) b-> BPB_BytsPerSec);' ('intttypes.h' für die Verwendung dieser Makros) – MikeCAT

+0

BPB_BytsPerSec ist ein WORD (aka unsigned short). Integer-Heraufstufung macht es zu einem 32-Bit-Wert und * lang * ist sicher auch ein 32-Bit-Wert auf Ihrem Compiler, so dass% lu nicht fürchterlich falsch ist. Aber sicher, 514 kann nicht stimmen. Off-by-2 lässt keine vernünftige Vermutung darüber, wie das schief gelaufen ist. –

+0

Warum 514 abgerufen wird: Wo ist lesen für 'b-> BPB_BytsPerSec' kann falsch sein oder es kann zusätzliche Auffüllung in der Struktur (es gibt 11 Bytes vor 'BPB_BytesPerSec' und was nach' BPB_BytesPerSec' ist' BPB_SecPerClus', die kann 2). – MikeCAT

Antwort

0
typedef unsigned char BYTE; 
typedef unsigned short WORD; 
typedef unsigned long DWORD; 
typedef unsigned long long QWORD;