12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- //------------------------------------------------------------
- // Game Framework
- // Copyright © 2013-2021 loyalsoft. All rights reserved.
- // Homepage: http://www.game7000.com/
- // Feedback: http://www.game7000.com/
- //------------------------------------------------------------
- using System;
- using System.Runtime.InteropServices;
- namespace GameFramework.FileSystem
- {
- internal sealed partial class FileSystem : IFileSystem
- {
- /// <summary>
- /// 字符串数据。
- /// </summary>
- [StructLayout(LayoutKind.Sequential)]
- private struct StringData
- {
- private static readonly byte[] s_CachedBytes = new byte[byte.MaxValue + 1];
- private readonly byte m_Length;
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = byte.MaxValue)]
- private readonly byte[] m_Bytes;
- public StringData(byte length, byte[] bytes)
- {
- m_Length = length;
- m_Bytes = bytes;
- }
- public string GetString(byte[] encryptBytes)
- {
- if (m_Length <= 0)
- {
- return null;
- }
- Array.Copy(m_Bytes, 0, s_CachedBytes, 0, m_Length);
- Utility.Encryption.GetSelfXorBytes(s_CachedBytes, 0, m_Length, encryptBytes);
- return Utility.Converter.GetString(s_CachedBytes, 0, m_Length);
- }
- public StringData SetString(string value, byte[] encryptBytes)
- {
- if (string.IsNullOrEmpty(value))
- {
- return Clear();
- }
- int length = Utility.Converter.GetBytes(value, s_CachedBytes);
- if (length > byte.MaxValue)
- {
- throw new GameFrameworkException(Utility.Text.Format("String '{0}' is too long.", value));
- }
- Utility.Encryption.GetSelfXorBytes(s_CachedBytes, encryptBytes);
- Array.Copy(s_CachedBytes, 0, m_Bytes, 0, length);
- return new StringData((byte)length, m_Bytes);
- }
- public StringData Clear()
- {
- return new StringData(0, m_Bytes);
- }
- }
- }
- }
|