我想用 C 讀取一個沒有任何庫的 PNG 影像檔案。從PNG(便攜式網路圖形)規范 1.0 版開始,任何 PNG 檔案都有一個簽名,可以將其與其他影像格式區分開來。簽名是影像的前 8 個位元組。
一些來源如上述 RFC 提到簽名為:
137 80 78 71 13 10 26 10(十進制)
或者像無法讀取 PNG 檔案的 IHDR 塊提到的簽名為:
89 50 4E 47 0D 0A 1A 0A (ASCII)
所以,我寫了一個簡單的代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE (8)
int main(int argc, char **argv){
if(argc != 2) {
printf("Usage: %s <png file>\n", argv[0]);
return 1;
}
char *buf = (char *)malloc(MAX_SIZE);
if(!buf) {
fprintf(stderr, "Couldn't allocate memory\n");
return 1;
}
FILE *f = fopen(argv[1], "r");
if(!f) {
perror("fopen");
printf("Invalid file\n");
free(buf);
return 1;
}
int size = fread(buf, 1, MAX_SIZE, f);
printf(%c\n", buf[1]);
printf(%c\n", buf[2]);
printf(%c\n", buf[3]);
printf(%c\n", buf[4]);
printf(%c\n", buf[5]);
printf(%c\n", buf[6]);
printf(%c\n", buf[7]);
printf(%c\n", buf[8]);
fclose(f);
free(buf);
system("pause");
return 0;
}
當我列印位元組時printf,輸出與上面不同。這是它顯示的內容:
?PNG→?v@,
有人可以描述發生了什么,我可以做些什么來修改它?
uj5u.com熱心網友回復:
您需要使用正確的格式說明符列印每個值。這里我們需要數字表示,而不是字符表示。
從檔案中printf:
%c寫一個字符%d將有符號整數轉換為十進制表示%x將無符號整數轉換為十六進制表示
X使用ABCDEF(而不是abcdef)列印最小寬度為兩個字符的十六進制,用前導零填充。
另請參見隱式轉換。
一個例子:
#include <stdio.h>
#define SIZE 8
int main(int argc, char **argv) {
unsigned char magic[SIZE];
FILE *file = fopen(argv[1], "rb");
if (!file || fread(magic, 1, SIZE, file) != SIZE) {
fprintf(stderr, "Failure to read file magic.\n");
return 1;
}
/* Decimal */
for (size_t i = 0; i < SIZE; i )
printf("%d ", magic[i]);
printf("\n");
/* Hexadecimal */
for (size_t i = 0; i < SIZE; i )
printf("X ", magic[i]);
printf("\n");
fclose(file);
}
輸出:
137 80 78 71 13 10 26 10
89 50 4E 47 0D 0A 1A 0A
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/366649.html
上一篇:命令不會繼承docker鏡像
下一篇:特定目錄中的圖庫活動
