一个简单的png文件格式解析的代码,采用标准C来完成的。 #include <stdio.h> #include <string.h> void pngPrintHelp(void); int pngCheckExtention(char *filename); void pngParserFile(char *name, int flag); #define PARSER_FLAG_VERBOSE 0x00000001 int main(int argc, char **argv) { int i, parserFlag = 0; /* when no argument, output help and exit */ if (argc <= 1) { pngPrintHelp(); return 0; } for(i=0; i<argc; i++) { if(strcmp(argv[i], "--verbose")) { parserFlag = PARSER_FLAG_VERBOSE; break; } } for(i=1; i<argc; i++) { if(pngCheckExtention(argv[i]) == 0) { pngParserFile(argv[i], parserFlag); continue; } } return 0; } void pngPrintHelp(void) { printf("This is Png file format debuger.../n"); printf("Please use this debuger as :/n"); printf("./png xxx.png [xxx.png] :/n"); } int pngCheckExtention(char *filename) { int len = strlen(filename); return strcmp((char *)(filename+len-4), ".png"); } //==================================================== typedef struct _pngInfo { unsigned char signature[8]; }pngInfo; void pngCheckChunkInfo(FILE *fPng, int flag) { char chunkID[4], len[4]; int offset = 0, address, size; fseek(fPng, 8, SEEK_SET); while(!feof(fPng)) { fseek(fPng, offset, SEEK_CUR); address = ftell(fPng); fread(len, 4, 1, fPng); fread(chunkID, 4, 1, fPng); printf("%c%c%c%c/n", chunkID[0],chunkID[1],chunkID[2],chunkID[3]); printf("%08X: Chunk length: %02X %02X %02X %02X/n", address, len[0],len[1],len[2],len[3]); printf("%08X: Chunk ID: %02X %02X %02X %02X/n", address+4, chunkID[0],chunkID[1],chunkID[2],chunkID[3]); size = len[0]; size <<= 8; size |= len[1]; size <<= 8; size |= len[2]; size <<= 8; size |= len[3]; printf("size == %d/n", size); offset = size + 4; if((chunkID[0] == 'I')&&(chunkID[1] == 'E')&&(chunkID[2] == 'N')&&(chunkID[3] == 'D')) break; } } void pngParserFile(char *name, int flag) { FILE *fPng; pngInfo info; fPng = fopen(name, "rb"); fread(info.signature, 8, 1, fPng); printf("PNG signature:/n%02X %02X %02X %02X %02X %02X %02X %02X/n", info.signature[0],info.signature[1], info.signature[2], info.signature[3], info.signature[4],info.signature[5], info.signature[6], info.signature[7]); pngCheckChunkInfo(fPng, flag); fclose(fPng); }