using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Text;
using UnityEngine;
namespace LightReflectiveMirror
{
public static class LRMTools
{
public static void WriteByte(this byte[] data, ref int position, byte value)
{
data[position] = value;
position += 1;
}
public static byte ReadByte(this byte[] data, ref int position)
{
byte value = data[position];
position += 1;
return value;
}
public static void WriteBool(this byte[] data, ref int position, bool value)
{
unsafe
{
fixed (byte* dataPtr = &data[position])
{
bool* valuePtr = (bool*)dataPtr;
*valuePtr = value;
position += 1;
}
}
}
public static bool ReadBool(this byte[] data, ref int position)
{
bool value = BitConverter.ToBoolean(data, position);
position += 1;
return value;
}
public static void WriteString(this byte[] data, ref int position, string value)
{
if (string.IsNullOrWhiteSpace(value))
{
data.WriteInt(ref position, 0);
}
else
{
data.WriteInt(ref position, value.Length);
for (int i = 0; i < value.Length; i++)
data.WriteChar(ref position, value[i]);
}
}
public static string ReadString(this byte[] data, ref int position)
{
string value = default;
int stringSize = data.ReadInt(ref position);
for (int i = 0; i < stringSize; i++)
value += data.ReadChar(ref position);
return value;
}
public static void WriteBytes(this byte[] data, ref int position, byte[] value)
{
data.WriteInt(ref position, value.Length);
for (int i = 0; i < value.Length; i++)
data.WriteByte(ref position, value[i]);
}
public static byte[] ReadBytes(this byte[] data, ref int position)
{
int byteSize = data.ReadInt(ref position);
byte[] value = new byte[byteSize];
for (int i = 0; i < byteSize; i++)
value[i] = data.ReadByte(ref position);
return value;
}
public static void WriteChar(this byte[] data, ref int position, char value)
{
unsafe
{
fixed (byte* dataPtr = &data[position])
{
char* valuePtr = (char*)dataPtr;
*valuePtr = value;
position += 2;
}
}
}
public static char ReadChar(this byte[] data, ref int position)
{
char value = BitConverter.ToChar(data, position);
position += 2;
return value;
}
public static void WriteInt(this byte[] data, ref int position, int value)
{
unsafe
{
fixed (byte* dataPtr = &data[position])
{
int* valuePtr = (int*)dataPtr;
*valuePtr = value;
position += 4;
}
}
}
public static int ReadInt(this byte[] data, ref int position)
{
int value = BitConverter.ToInt32(data, position);
position += 4;
return value;
}
}
internal static class CompressorExtensions
{
///
/// Decompresses the string.
///
/// The compressed text.
///
public static string Decompress(this string compressedText)
{
byte[] gZipBuffer = Convert.FromBase64String(compressedText);
using (var memoryStream = new MemoryStream())
{
int dataLength = BitConverter.ToInt32(gZipBuffer, 0);
memoryStream.Write(gZipBuffer, 4, gZipBuffer.Length - 4);
var buffer = new byte[dataLength];
memoryStream.Position = 0;
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
{
gZipStream.Read(buffer, 0, buffer.Length);
}
return Encoding.UTF8.GetString(buffer);
}
}
}
internal static class JsonUtilityHelper
{
public static bool IsJsonArray(string json)
{
return json.StartsWith("[") && json.EndsWith("]");
}
public static T[] FromJson(string json)
{
if (!IsJsonArray(json))
{
throw new System.FormatException("The input json string is not a Json Array");
}
json = "{\"Items\":" + json + "}";
JsonWrapper wrapper = JsonUtility.FromJson>(json);
return wrapper.Items;
}
public static string ToJson(T[] array)
{
JsonWrapper wrapper = new JsonWrapper();
wrapper.Items = array;
return JsonUtility.ToJson(wrapper);
}
public static string ToJson(T[] array, bool prettyPrint)
{
JsonWrapper wrapper = new JsonWrapper();
wrapper.Items = array;
return JsonUtility.ToJson(wrapper, prettyPrint);
}
[Serializable]
private class JsonWrapper
{
public T[] Items;
}
}
}