在matlab中讀取二進位檔案

來源:互聯網
上載者:User
一、基礎知識
來源:http://crystaldonna.blog.sohu.com/84162722.html

        從檔案編碼的方式來看,檔案可分為ASCII碼檔案和二進位碼檔案兩種:
ASCII檔案也稱為文字檔,這種檔案在磁碟中存放時每個字元對應一個位元組,用於存放對應的ASCII碼。ASCII碼檔案可在螢幕上按字元顯示,例如來源程式檔案就是ASCII檔案,用DOS命令TYPE可顯示檔案的內容。由於是按字元顯示,因此能讀懂檔案內容。
        二進位檔案是按二進位的編碼方式來存放檔案的。例如,數5678的儲存形式為:00010110    00101110 只佔二個位元組。二進位檔案雖然也可在螢幕上顯示,但其內容無法讀懂。C系統在處理這些檔案時,並不區分類型,都看成是字元流,按位元組進行處理。輸入輸出字元流的開始和結束只由程式控制而不受物理符號(如斷行符號符)的控制。因此也把這種檔案稱作“流式檔案”。 
        流可以分為兩種類型:文字資料流和二進位流。文字資料流是解釋性的,最長可達255個字元,其中斷行符號/換行將被轉換為分行符號“/n”,(如果以"文本"方式開啟一個檔案,那麼在讀字元的時候,系統會把所有的"/r /n"序列轉成"/n",在寫入時把"/n"轉成"/r/n" )。二進位流是非解釋性的,一次處理一個字元,並且不轉換字元。

註: 

       /n一般會作業系統被翻譯成"行的結束",即LF(Line-Feed)
       /r會被翻譯成"斷行符號",即CR(Cariage-Return)
       對於文字檔的新行,在UNIX上,一般用/n(LF)來表示,Mac上用/r(CR)來表示,
       Windows上是用/n/r(CR-LF)來表示。      

        在 matlab 中儲存成為二進位還是文字檔取決於fopen的方式,如果用wt,則儲存為文字檔,這樣用記事本開啟就可以正常顯示了;如果用w則儲存為二進位檔案,這樣用記事本開啟會出現小黑方塊,要正常顯示的話,可以用寫字板或UltraEdit等工具開啟。

二、在matlab中讀取二進位檔案
來源:http://blog.sina.com.cn/s/blog_4a0e9d52010091se.html

   初學matlab時,總會遇到讀取位元據的問題,下面給出瞭解決辦法. matlab可以直接讀取位元據檔案,並且可以將其加入到矩陣中。如果對c語言十分熟悉的話,應該對fopen,fclose,ftell, fseek,fread,fwrite,feof這些函數非常熟悉了,幸運的是在matlab中仍然可以使用這些函數來讀入實驗資料。   現在假定有一個資料檔案叫data.dat,它的前面2k是存放參數的,我們做資料處理的時候需要跳過去,後面的資料是16位整數類型的,每組資料有512個。現在要把該資料檔案的所有資料讀入一個nx512的矩陣中,n的個數不定,根據資料檔案中的資料而定。用.m指令碼的方式編寫如下:% deal data from specified data file
clear ;
data_fname = 'data.dat' ; % 這裡是檔案名稱
jump_distance = 2048 ;    % 這裡是跳過的位元組數% 開啟檔案為二進位開啟,其實'r'就行,matlab是預設二進位形式開啟檔案的file_id = fopen(data_fname, 'rb');% 從檔案開始跳過jump_distance個位元組
fseek(file_id, jump_distance, 'bof');% 先手工構造一個1x512大小的矩陣
raw_data = [1:1:512] ;
while feof(file_id) == 0     % 這就是大名頂頂的fread了,資料類型是int16,每次讀入512個數    % raw_array每次都是512x1的矩陣,ele_count為讀入的數的個數(正常情況下應為512)
    [row_array, ele_count] = fread(file_id, 512, 'int16') ;
    if ele_count < 512 % elecount < 512代表資料不夠,已經到了檔案的結尾
        break ;
    else         % 將512x1的row_array轉置一下,變為1x512的矩陣
        row_array = row_array'  ;         % 然後,將row_array追加到raw_data中
        raw_data = [raw_data; row_array] ;
    end
end
% get off the first line [1:1:512]% 這裡就是要把raw_data的第一行資料手工構造的那行資料給去掉,剩下的就都是檔案中的資料了
raw_data(1,:)=[] ;% 關閉檔案
fclose(file_id);% delete other usless vars% 這裡是把用過的變數都刪除掉,免得workspace裡面亂七八糟的什麼都有,這是個好習慣,呵呵。
clear data_fname jump_distance file_id fid ele_count i m n row_array ans;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.