👨?💻個人主頁:@元宇宙-秩沅
👨?💻 hallo 歡迎 點贊👍 收藏? 留言📝 加關注?!
👨?💻 本文由 秩沅 原創
👨?💻 專欄交流 | 🧧 |
---|---|
🟥Unity100個實戰基礎? | 🎁 |
🟦 Unity100個精華一記? | 🎁 |
🟩 Unity50個demo案例教程? | 🎁 |
🟨 Unity100個精華細節BUG? | 🎁 |
文章目錄
- ?前言?
- 🎶(==1==) 數據相互轉換
- 🎶(==2==) 文件操作
- 🎶(==3==) 文件夾操作
- 🎶(==4==) 序列化
- 🎶(==5==) 反序列化
- 🎶(==6==)二進制加密
- 🎶(==7==) BinaryData管理器
- ?🅰?系統路線學習點擊跳轉?
?前言?
有符號 sbyte int short long
無符號 byte uint ushort ulong
浮點 float double decimal
特殊 bool char string
變量的本質是2進制,內存中以字節的形式存儲,sizeof方法可以看到常用變量類型占用的字節空間長度
sizeof(sbyte)
sizeof(long) …
- 節約存儲空間,提升效率
- 提升安全性
🎶(1) 數據相互轉換
-
在Unity中各類型數據和字節數據相互轉換
-
1.將各類型轉字節
byte[] bytes = BitConverter.GetBytes(256);
- 2.字節數組轉各類型
int i = BitConverter.ToInt32(bytes, 0);
為保證編碼的正確性,編碼要規范化、標準化,即需有標準的編碼格式。
在C#中有一個專門的編碼格式類 來幫助我們將字符串和字節數組進行轉換
游戲開發中常用編碼格式 UTF-8
中文相關編碼格式 GBK
英文相關編碼格式 ASCII
- 1.將字符串以指定編碼格式轉字節
byte[] bytes = Encoding.UTF8.GetBytes("你好");
- 2.字節數組以指定編碼格式轉字符串
string str = Encoding.UTF8.GetString(bytes);
🎶(2) 文件操作
命名空間: System.IO
- 1.判斷文件是否存在
if(File.Exists(Application.dataPath + "/Text")){//存在}
- 2.創建文件
FileStream fstream = File.Create(Application.dataPath + "/text");
- 3.寫入文件
//字節數組 寫入到指定路徑的文件中byte[] bytes = BitConverter.GetBytes(100);File.WriteAllBytes(Application.dataPath + "/text", bytes);//string數組內容 一行行寫入到指定路徑中
string[] strs = new string[] { "姓名", "你好", "1", "23"};
File.WriteAllLines(Application.dataPath + "/text", strs);//字符串寫入指定路徑
File.WriteAllText(Application.dataPath + "/text", "xahhll");
- 4.讀取文件
//讀取字節數據bytes = File.ReadAllBytes(Application.dataPath + "/text");print(BitConverter.ToInt32(bytes, 0));//讀取所有行信息
strs = File.ReadAllLines(Application.dataPath + "/text");for (int i = 0; i < strs.Length; i++){print(strs[i]);}//讀取所有文本信息
print(File.ReadAllText(Application.dataPath + "/text"));
- 5.刪除文件
File.Delete(Application.dataPath + "/text");//文件前提是關閉的
- 6.復制文件
參數一:現有文件 需要是流關閉狀態
參數二:目標文件File.Copy(Application.dataPath + "/text", Application.dataPath + "/text2", true);
- 7.文件替換
//參數一:用來替換的路徑//參數二:被替換的路徑//參數三:備份路徑File.Replace(Application.dataPath + "/text", Application.dataPath + "/text2", Application.dataPath + "/備份text");
- 8.以流的形式 打開文件并寫入或讀取
//參數一:路徑
//參數二:打開模式
//參數三:訪問模式
FileStream fs = File.Open(Application.dataPath + "/text",
FileMode.OpenOrCreate, FileAccess.ReadWrite);
🎶(3) 文件夾操作
命名空間:using System.IO
作用:增刪查改文件夾
- 1.判斷文件夾是否存在
if( Directory.Exists(Application.dataPath + "/文件夾名"))
{print("存在");
}
- 2.創建文件夾
DirectoryInfo info = Directory.CreateDirectory(Application.dataPath + "/文件夾名");
- 3.刪除文件夾
//參數一:路徑
//參數二:true,將刪除整個目錄,false,僅當該目錄為空時才刪除
Directory.Delete(Application.dataPath + "/文件夾名");
- 4.查找文件夾和文件
//得到所有文件夾名
string[] strs = Directory.GetDirectories(Application.dataPath);
for (int i = 0; i < strs.Length; i++)
{print(strs[i]);
}
//得到所有文件名
strs = Directory.GetFiles(Application.dataPath);
for (int i = 0; i < strs.Length; i++)
{print(strs[i]);
}
- 5.移動文件夾
//移動會把文件夾中的所有內容一起移到新的路徑
Directory.Move(Application.dataPath + "/文件夾名", Application.dataPath + "/路徑");//該路徑下面需為空
- 6.創建文件夾方法的返回值
DirectoryInfo Info = Directory.CreateDirectory(Application.dataPath + "/文件夾名");
//全路徑
print(Info .FullName);
//文件名
print(Info .Name);
- 7.查找上級文件夾信息
Info = Directory.GetParent(Application.dataPath + "/文件夾名");
//全路徑
print(Info .FullName);
//文件名
print(Info .Name);
- 8.得到所有子文件夾的目錄信息
DirectoryInfo[] dInfos = Info.GetDirectories();
FileInfo[] fInfos = dInfo.GetFiles();
for (int i = 0; i < fInfos.Length; i++)
{print("**************");print(fInfos[i].Name);//文件名print(fInfos[i].FullName);//路徑print(fInfos[i].Length);//字節長度print(fInfos[i].Extension);//后綴名
}
🎶(4) 序列化
序列化類對象
- 1.第一步申明類對象
注意:如果要使用C#自帶的序列化2進制方法
申明類時需要添加[System.Serializable]特性
- 第二步—將對象進行2進制序列化
Person p = new Person(); //主要方法:序列化方法 Serializeusing (MemoryStream ms = new MemoryStream()){//2進制格式化程序BinaryFormatter bf = new BinaryFormatter();//序列化對象 生成2進制字節數組 寫入到內存流當中bf.Serialize(ms, p);//得到對象的2進制字節數組byte[] bytes = ms.GetBuffer();//存儲字節File.WriteAllBytes(Application.dataPath + "/文件", bytes);//關閉內存流ms.Close();}
方法二:使用文件流進行存儲
主要用于存儲到文件中
Person p = new Person(); using (FileStream fs = new FileStream(Application.dataPath + "/文件名", FileMode.OpenOrCreate, FileAccess.Write)){//2進制格式化程序BinaryFormatter bf = new BinaryFormatter();//序列化對象 生成2進制字節數組 寫入到內存流當中bf.Serialize(fs, p);fs.Flush();fs.Close();}}
}
🎶(5) 反序列化
- 1.反序列化文件中數據
using (FileStream fs = File.Open(Application.dataPath + "/文件名", FileMode.Open, FileAccess.Read)){//申明一個 2進制格式化類BinaryFormatter bf = new BinaryFormatter();//反序列化Person p = bf.Deserialize(fs) as Person;fs.Close();}
- 2.反序列化網絡傳輸過來的2進制數據
沒有網絡傳輸 就直接從文件中獲取
byte[] bytes = File.ReadAllBytes(Application.dataPath + "/文件名");//申明內存流對象 一開始就把字節數組傳輸進去using (MemoryStream ms = new MemoryStream(bytes)){//申明一個 2進制格式化類BinaryFormatter bf = new BinaryFormatter();//反序列化Person p = bf.Deserialize(ms) as Person;ms.Close();}
🎶(6)二進制加密
- 簡單的異或加密和解密
Person p = new Person();byte key = 199;using (MemoryStream ms = new MemoryStream()){BinaryFormatter bf = new BinaryFormatter();bf.Serialize(ms, p);byte[] bytes = ms.GetBuffer();//異或加密for (int i = 0; i < bytes.Length; i++){bytes[i] ^= key;}File.WriteAllBytes(Application.dataPath + "/文件夾名", bytes);}//解密byte[] bytes2 = File.ReadAllBytes(Application.dataPath + "/文件夾名");for (int i = 0; i < bytes2.Length; i++){bytes2[i] ^= key;}using (MemoryStream ms = new MemoryStream(bytes2)){BinaryFormatter bf = new BinaryFormatter();Person p2 = bf.Deserialize(ms) as Person;ms.Close();}
🎶(7) BinaryData管理器
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using UnityEngine;/// <summary>
/// 2進制數據管理器
/// </summary>
public class BinaryDataMgr
{/// <summary>/// 2進制數據存儲位置路徑/// </summary>public static string DATA_BINARY_PATH = Application.streamingAssetsPath + "/Binary/";/// <summary>/// 用于存儲所有Excel表數據的容器/// </summary>private Dictionary<string, object> tableDic = new Dictionary<string, object>();/// <summary>/// 數據存儲的位置/// </summary>private static string SAVE_PATH = Application.persistentDataPath + "/Data/";private static BinaryDataMgr instance = new BinaryDataMgr();public static BinaryDataMgr Instance => instance;//------后續代碼請私信獲取——————————————————————————
}
?🅰?系統路線學習點擊跳轉?
👨?💻 Unity程序基礎學習路線 | 🧧 |
---|---|
?【Unityc#專題篇】之c#進階篇】 | 🎁 |
?【Unityc#專題篇】之c#核心篇】 | 🎁 |
?【Unityc#專題篇】之c#基礎篇】 | 🎁 |
?【Unity-c#專題篇】之c#入門篇】 | 🎁 |
?【Unityc#專題篇】—進階章題單實踐練習 | 🎁 |
?【Unityc#專題篇】—基礎章題單實踐練習 | 🎁 |
?【Unityc#專題篇】—核心章題單實踐練習 | 🎁 |
你們的點贊👍 收藏? 留言📝 關注?是我持續創作,輸出優質內容的最大動力!、