unity学习笔记-
- 读写文件遇到的问题
- 实现的功能
- 遇到的问题
- 解决办法
读写文件遇到的问题
实现的功能
给文件名加密,读写的时候都通过这个加密的文件名进行访问写入,通过filestream进行音频的写入,通过www进行文件的访问,通过audioclip.getaudiocompressed、getaudioclip都可以获得audio格式的数据并在unity场景中进行播放
遇到的问题
当文件名称过长时,总会报错
类似这样的问题,在网上搜索也基本和我的问题大相径庭,过程尝试过更换读写的格式以及逻辑的检查,发现都没有什么问题
解决办法
后面试着将文件名强行写成1,想着先解决写入的问题,再去解决读取的问题
然后发现这样一来音频就可以写入了,思考了一番之后感觉可能是文件名称过长导致的,所以试着对文件名进行剪切,然后运行,不报错,也能正常读写和播放。问题解决
下面这是写入本地音频的方法,首先是对名称进行加密和剪切,然后才是写入
public void WriteAudio(byte[] audiodata,string audioName)
{
//对文件名进行加密
audioName = EncAndCut(audioName);
string path = Application.persistentDataPath + "/" + audioName + ".mp3";
FileStream sf = new FileStream(path, FileMode.Create,FileAccess.Write);//打开文件流
sf.Write(audiodata, 0, audiodata.Length);//写入文件
//关闭文件流
sf.Close();
sf.Dispose();
}
下面这是读取的方法,同样的先用加密的方式获得文件名称,然后用www进行访问,然后直接调用他的getaudioclipcompressed的方法获得unity支持的音频数据格式,传给audioclip。进行播放即可~
public void ReadLocalAudio(string audioName)
{
StartCoroutine(RLATimeDelta(audioName));
}
IEnumerator RLATimeDelta(string audioName)
{
string path = "";
//对文件名进行加密
string encFileName = EncAndCut(audioName);
if (Application.platform == RuntimePlatform.Android)
{
path = "file://" + Application.persistentDataPath + "/" + encFileName + ".mp3";
}
else if (Application.platform == RuntimePlatform.WindowsEditor)
{
path = Application.persistentDataPath + "/" + encFileName + ".mp3";
}
WWW test = new WWW(path);
yield return test;
GameObject.Find("Music").GetComponent<AudioSource>().volume = 0.01f;
player.clip = test.GetAudioClipCompressed();
player.Play();
yield return new WaitForSeconds(player.clip.length * 1.5f);
GameObject.Find("Music").GetComponent<AudioSource>().volume = 0.164f;
}
更新
刚才试了一下, 发现不是文件名称过长导致的,而是在给文件名称加密的时候出现了斜杠,程序对名称进行识别的时候有斜杠的话好像会有歧义,导致无法识别,记录一下
更新解决办法
对加密的数据在进行编码,把斜杠等特殊符号转换成非特殊符号
public static string EncryptDES(string encryptString, string key = 32位的key)
{
Debug.Log(SystemInfo.deviceUniqueIdentifier);
if (string.IsNullOrEmpty(encryptString)) return null;
Byte[] toEncryptArray = Encoding.UTF8.GetBytes(encryptString);
RijndaelManaged rm = new RijndaelManaged
{
Key = Encoding.UTF8.GetBytes(key),
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
ICryptoTransform cTransform = rm.CreateEncryptor();
Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
string convertStr = Convert.ToBase64String(resultArray, 0, resultArray.Length);
//上面获得转换成base64编码的加密信息
//下面再对漆进行编码转换即可
string strTemp = "";
byte[] bTemp = Encoding.Default.GetBytes(convertStr);
for (int i = 0; i < bTemp.Length; i++)
{
strTemp += bTemp[i].ToString("X2");
}
return strTemp;
//return StrToHex;
}