这里主要是记录一下学习心得,便于后面的记忆与学习,也是借鉴前辈的学习心得,不喜勿喷
在这里网友也可以借鉴学习
完整代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;//加密算法引用的命名空间
public static class IOHelper {
/// <summary>
/// 判断文件是否存在
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static bool IsFileExists(string fileName)
{
return File.Exists(fileName);
}
/// <summary>
/// 判断路径是否存在
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static bool IsDirectoryExists(string fileName)
{
return Directory.Exists(fileName);
}
/// <summary>
/// 创建一个文本文件
/// </summary>
/// <param name="fileName"></param>
/// <param name="content"></param>
public static void CreateFile(string fileName,string content)
{
StreamWriter sw = File.CreateText(fileName);
sw.Write(content);
sw.Close();
}
/// <summary>
/// 创建一个文件夹
/// </summary>
/// <param name="fileName"></param>
public static void CreateDirectory(string fileName)
{
if (IsDirectoryExists(fileName))
return;
Directory.CreateDirectory(fileName);
}
/// <summary>
/// 设置加密
/// </summary>
/// <param name="fileName"></param>
/// <param name="pObject"></param>
public static void SetData(string fileName,string key,object o)
{
//序列化为字符串
string toSave = JsonUtility.ToJson(o);
toSave = RijndaelEncrypt(toSave, key);
StreamWriter sw = File.CreateText(fileName);
sw.Write(toSave);
sw.Close();
}
/// <summary>
/// 加密算法
/// </summary>
/// <param name="fileName">密钥,长度可以为:64位(byte[8]),128位(byte[16]),192位(byte[24]),256位(byte[32])</param>
/// <param name="pType"></param>
/// <returns></returns>
public static string GetData(string fileName,string key)
{
StreamReader sr = File.OpenText(fileName);
string data = sr.ReadToEnd();
//对数据进行解密,32位解密密钥
data = RijndaelDecrypt(data, key);
sr.Close();
return data;
}
private static string RijndaelEncrypt(string pString,string pKey)
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(pKey);//密钥
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(pString);//待加密明文数组
//加密算法
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateEncryptor();
//返回加密后的密文
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
/// <summary>
/// Rijndael解密算法
/// </summary>
/// <param name="pString"></param>
/// <param name="pKey"></param>
/// <returns></returns>
public static string RijndaelDecrypt(string pString,string pKey)
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(pKey);//解密密钥
byte[] toEncryArray = Convert.FromBase64String(pString);//待解密密文数组
//Rijndael解密算法
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateDecryptor();
//返回解密后的明文
byte[] resultArray = cTransform.TransformFinalBlock(toEncryArray, 0, toEncryArray.Length);
return UTF8Encoding.UTF8.GetString(resultArray);
}
}
测试脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]//序列化
public class Student
{
public string Name;
public int ID;
public Student(string name,int id)
{
this.Name = name;
this.ID = id;
}
}
public class Test : MonoBehaviour {
public string key = "12345678912345678912345678912345";
string path;
void Start () {
path = Application.persistentDataPath + "/Save";
IOHelper.CreateDirectory(path);
string fileName = path + "/GameData.sav";
Debug.Log(fileName);
Student s = new Student("张三", 45);
IOHelper.SetData(fileName, key, s);
string message = IOHelper.GetData(fileName, key);
Student ss = JsonUtility.FromJson<Student>(message);
Debug.Log(ss.Name+":"+ss.ID);
}
}