2016-07-09 2 views
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을 사용하고 있습니다) 우리가 얘기하고있는 구조입니다 a Sample output

,536,913,632 : 값 .. 여기서

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

+1

캐스팅은 어떨까요? – MikeCAT

+0

BPB_BytsPerSec은 WORD (unsigned short라고도 함)입니다.이 매크로를 사용하기 위해서는'int '를 사용하십시오. 정수 승격은 32 비트 값으로 만들고 * long *은 컴파일러에서의 32 비트 값이기 때문에 % lu는 끔찍한 잘못이 아닙니다. 그러나 확실히, 514는 맞을 수 없습니다. Off-by-2는 이것이 어떻게 잘못되었는지를 합리적으로 추측하지 않습니다. –

+0

514가 검색되는 이유 : 'b-> BPB_BytsPerSec'에 대한 읽기가 잘못되었거나 구조에 여분의 패딩이있을 수 있습니다 ('BPB_BytesPerSec '앞에 11 바이트가 있고'BPB_BytesPerSec '뒤에는 BPB_SecPerClus가 있습니다. 2 일 수 있습니다. – MikeCAT

답변

0
typedef unsigned char BYTE; 
typedef unsigned short WORD; 
typedef unsigned long DWORD; 
typedef unsigned long long QWORD; 
관련 문제