嵌入式Linux 讀取bmp檔案頭資訊

2021-08-27 05:21:34 字數 1925 閱讀 2876

//檔案頭結構體

typedef

struct

bitmapfileheader;

函式如下:

/*

*返回值 :錯誤時返回-1,解析正確返回0

*/int

bmp_analyze

(unsigned

char

*path)

//讀取檔案頭資訊

read

(fd,

&fheader,

sizeof

(fheader));

printf

("bfsize:%ld\n"

, fheader.bfsize)

;printf

("bfoffbits:%ld\n"

, fheader.bfoffbits)

;//關閉開啟的檔案

close

(fd)

;return0;

}

執行結果如下:

顯示bfsize(檔案大小)為28,這顯然是不對的。根據winhex檢視可以看到,實際資料為0x36 0x20 0x1c 0x00,而在bmp檔案中資料儲存方式為小端模式(低位址存放低位元組),因此實際bfsize為1843254(0x1c2036)個位元組。

下面開始查詢問題。

將讀取到的資訊都列印出來,分析原始資料。

int

bmp_analyze

(unsigned

char

*path)

//讀取檔案頭資訊

read

(fd,

&fheader,

sizeof

(fheader));

printf

("bfsize:%ld\n"

, fheader.bfsize)

;printf

("bfoffbits:%ld\n"

, fheader.bfoffbits)

;//將讀取到的資訊列印出來

for(i =

0; i <

sizeof

(fheader)

; i++

)printf

("\n");

//關閉開啟的檔案

這裡扯一下位元組對齊,以前也看了好多資料,總結一下就四點:

解決辦法:取消位元組對齊。

取消位元組對齊的兩種方法:

結構體定義於是被修改為了:

typedef

struct

__attribute__

((packed)

) bitmapfileheader;

原鏈結本來預設就取消了位元組對齊,但是一開始並不了解具體深意,於是就被我刪掉了,看來還是得加上。

除錯結果如下圖:

到這裡就顯示正常了,1843254就是0x1c2036,還有乙個問題是偽指令#pragma pack ()沒效果,不知道是gcc的問題還是什麼其他的問題。

嵌入式 linux 編譯

第二次換了編譯環境編譯時又提示 make 3 drivers video console vgacon.o 錯誤 1 在網上搜尋結果 根據資訊的大概意思是關於vga的支援問題,在這裡我直接把關於vga的配置選項去掉不選,即 在執行 make menuconfig 配置時 不選vga 驅動。devic...

linux嵌入式開發

我的環境 主機 ubuntu 64位 開發板 mini2440 6 makefile檔案修改 在 opt friendlyarm mini2440 linux 2.6.29下執行 sudo vi.makefile 搜尋arm linux得到乙個結果 cross compile?arm linux 然...

嵌入式 Linux介紹

嵌入式 linux介紹 一 嵌入式是一門it技術。嵌入式這門it技術是幹什麼的?他有什麼價值?專門生產功能專一的智慧型電子產品 電子裝置 什麼是電子裝置?通電的東西,嵌入式來搞定,而且沒通電的影象化介面屬於應用層的那種,嵌入式也可以搞定。二 嵌入式開發的分類 基於系統平台的開發 做出來的產品有搭載系...