2010年4月20日 星期二

將數字將成 QString 的方法

如果要將一個數字轉成 QString class,可以使用下列用法:

int i = 127;
QString str;
str = QString::number(i, 10);

其中,number的第二個參數指的是幾進位,如果沒填,預設是十進位。

這個用法我已經用了又忘好幾次了,筆記一下。

2010年4月18日 星期日

記載 MP3 的資訊 -- ID3v1

打開檔案總管,對著一個MP3檔案按下右鍵→內容,在跳出的視窗選摘要,切到進階,可以看到演出者、專輯標題、年份、曲目、類型、標題、註解等資訊;同時,使用大部份的MP3播放器,也可以看到這些資訊。

mp3_info

 

這些資訊可以由數種方式帶在MP3的檔案內,其中,最簡單的方式,即是ID3 v1。

ID3v1有兩種版本,ID3v1及ID3v1.1版;不同之處,在於1.1多出了可紀錄track number的功能。

ID3v1的資訊帶在檔案的最後面,128 bytes 的地方。使用UltraEdit或是PSPad或任何可以觀看十六進位的編輯器,開一個MP3檔,移到檔案的最後,可以看到記載ID3v1的資訊。

放在檔案最後面,最大的好處在於,當使用者決定要新增或移除ID3v1的全部資訊時,只要將最後128 bytes做加入或移除動作即可;如果放在檔案開頭,則需要對整個檔案的內容做移動的動作。

mp3_info_2

ID3v1

下表即是ID3v1的結構圖。

‘TAG’ 3 bytes
標題 30 bytes
演出者 30 bytes
專輯名稱 30 bytes
年份 4 bytes
註解 30 bytes
歌曲類型 1 bytes

 

ID3v1以‘TAG’ 三個字元起始,後面接著30 bytes的歌曲名稱,30 bytes的演出者,30 bytes的專輯名稱,4 bytes 的年份,30 bytes的註解及 1 bytes的歌曲類型。連同 TAG ,共 128 bytes 大小。

因此,實作上非常容易,只要fopen一個檔案,fread最後128 bytes的資料,判斷前三個bytes的內容是不是 TAG 三個字元,即可知道是否帶 ID3v1 的資訊;接著,再依照上表,就可以分別讀出所需的資訊。

 

ID3v1.1

如前所述,1.1 版新增了track的資訊;但1.1考慮到向後相容,且ID3v1無任何空間,也無任何保留的欄位可供利用,要怎麼做才不會導致原有的ID3v1無法運作?

首先,需先說明,在ID3v1裡,未填資料的地方,需填上0;例如,演出者為 ‘Vivaldi’,共七個字元,剩下的 23 bytes,均需填0。

這裡採用的作法,是將註解的30 bytes,挪出最後 2 bytes 記載 track number;這 2 個 bytes 的第一個 bytes 必須要為 0,後一個 bytes 則記載 track 的資訊;因此,只要註解的第 29 bytes 不為 0,即無 track 存在的可能性;但第 29 個 bytes 為 0,接著必需檢查第 30 個 bytes,如果不為 0,這個就是 track 的資訊。

 

下圖為ID3v1及ID3v1.1的圖示。

id3v1_blocks id3v1.1_blocks

 

可以看出,v1.1的Comment較短,且新增了Album track的欄位;差別即在於此。

如需更詳細的資料,可以至 http://www.id3.org 查閱。

2010年4月15日 星期四

PuTTY 按下 Ctrl-S 畫面凍結的解決方法

常發生這種情況:使用 PuTTY 連到工作站,開了 vim 寫程式,寫到一半很自然會想存檔,很自然地就按了 Ctrl-S,然後整個視窗就停住了!只好含著淚開另一個視窗把 process kill 掉...

其實這是 PuTTY 一個好用的功能,當在 compile 或跑程式的時候,log 拼命地跑出來,這時想把畫面停下來,看看 log 訊息,就可以按下Ctrl-S,整個畫面就會凍結住;等看完後,要讓畫面回復正常,只要再按下 Ctrl-Q 就可以了。