👨💻个人主页:@元宇宙-秩沅
👨💻 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();
//主要方法:序列化方法 Serialize
using (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#专题篇】—核心章题单实践练习 | 🎁 |
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、