1. 程式人生 > >二進位制檔案操作-儲存與讀取

二進位制檔案操作-儲存與讀取

目標:實現資料儲存為二進位制檔案,然後通過二進位制檔案解析資料。

目標分為三個階段:1、將資料結構轉化為二進位制(至於資料是怎樣讀取進來的這個就不說了,因為方式比較多,但是讀取進來一定都會以特定的資料結構形式來儲存)。2、載入二進位制文字。3、載入為對應的資料結構。

階段一:將資料結構轉化為二進位制有兩種方式:1:利用C#的BinaryWrite,2:使用函式把資料轉化成byte陣列,然後在寫入。

方法1:

public bool SaveBinaryFile(string _path, string _name, TextAsset t){
		
		string content = t.text;
	
		//二進位制檔案流資訊
		BinaryWriter bw = new BinaryWriter(new FileStream (_path + _name, FileMode.Create));;

		FileStream fs = new FileStream (_path + _name, FileMode.Create);

		try {

			bw = new BinaryWriter(new FileStream (_path + _name, FileMode.Create));


		}catch(IOException e){

			Debug.Log (e.Message);

		}
		try {

			bw.Write(content);

		}catch(IOException e){

			Debug.Log (e.Message);

		}
		debugInfo += "檔案建立成功!\n";

		return true;

	}
說明:這種方法程式碼也沒幾行,方式也很好理解,我把過程封裝成函式,傳入路徑和檔名即可(溫馨提示:unity裡面二進位制存在StreamingAssets資料夾裡面,若不懂可百度,有很多資源)。

為了讓大家更好的理解我把路徑貼出來:

private string name = "1.bytes";

public static readonly string path = Application.streamingAssetsPath + "/";

方法2:
string path = Application.streamingAssetsPath + "/";
string name = "2.bytes";
int a = 15;
byte[] b = BitConverter.GetBytes (a);
File.WriteAllBytes (path + name, b);
說明:這種方法簡單方便,利用System.Text下的BitConverter將其他型別的轉化為二進位制型別[特殊:不包括String型別的轉化,string轉化用Encoding.UTF8.GetBytes即可]。

這樣階段一就完成了。

階段二:

載入二進位制文字採用www載入,目前我知道唯一簡單方便的載入方式,如果有更好的載入方式還請指教。

用www載入需要用到協程,如果對協程不是很懂的同學請自行查詢(記得以前寫過一篇但是沒找到,有時間也會整理一篇)。下面是載入程式碼。

IEnumerator wwwLoad(string _path, Action<byte[]> action){

		#if UNITY_EDITOR || UNITY_IOS
		_path = "file://" + _path;
		#endif
		
		WWW www = new WWW (_path);

		yield return www;

		action (www.bytes);
	}

注意點:下載的路徑有所變化,詳細瞭解可以去看看Unity的平臺路徑,因為與本文無關,不多說了。這裡我用了回撥,只是習慣,當然也可以等WWW下載完成後自行呼叫其他函式。

階段三:使用BinaryReader類解析二進位制檔案

public void readByte(byte[] b){
	using (BinaryReader br = new BinaryReader(new MemoryStream(b))){
		int f = br.ReadInt32 ();
		Debug.Log (f);
	}
}
只需要使用使BinaryReader類中的函式來讀取對一個型別的資料就可以了。

至此,任務完成。