223 lines
7.6 KiB
C#
223 lines
7.6 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.IO;
|
|||
|
using System.Linq;
|
|||
|
using System.Runtime.Serialization.Formatters.Binary;
|
|||
|
|
|||
|
[Serializable]
|
|||
|
public class AxiEssgssStatusData
|
|||
|
{
|
|||
|
public Dictionary<string, byte[]> MemberData = new Dictionary<string, byte[]>();
|
|||
|
public Dictionary<string, AxiEssgssStatusData_2DArray> Array2DMemberData = new Dictionary<string, AxiEssgssStatusData_2DArray>();
|
|||
|
public Dictionary<string, AxiEssgssStatusData> ClassData = new Dictionary<string, AxiEssgssStatusData>();
|
|||
|
}
|
|||
|
|
|||
|
[Serializable]
|
|||
|
public class AxiEssgssStatusData_2DArray
|
|||
|
{
|
|||
|
public int rows;
|
|||
|
public int cols;
|
|||
|
public byte[] array1D;
|
|||
|
public AxiEssgssStatusData_2DArray(byte[,] data2D)
|
|||
|
{
|
|||
|
rows = data2D.GetLength(0);
|
|||
|
cols = data2D.GetLength(1);
|
|||
|
array1D = data2D.FlattenByteArray2D();
|
|||
|
}
|
|||
|
|
|||
|
public byte[,] Get2DArrayBytesData()
|
|||
|
{
|
|||
|
return array1D.CreateByteArray2D(rows, cols);
|
|||
|
}
|
|||
|
}
|
|||
|
public static class AxiEssgssStatusDataExtention
|
|||
|
{
|
|||
|
public static byte[] ToByteArray(this AxiEssgssStatusData data)
|
|||
|
{
|
|||
|
using (MemoryStream ms = new MemoryStream())
|
|||
|
{
|
|||
|
BinaryFormatter formatter = new BinaryFormatter();
|
|||
|
formatter.Serialize(ms, data);
|
|||
|
return ms.ToArray();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public static AxiEssgssStatusData ToAxiEssgssStatusData(this byte[] byteArray)
|
|||
|
{
|
|||
|
using (MemoryStream ms = new MemoryStream(byteArray))
|
|||
|
{
|
|||
|
BinaryFormatter formatter = new BinaryFormatter();
|
|||
|
return (AxiEssgssStatusData)formatter.Deserialize(ms);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
public interface IAxiStatus
|
|||
|
{
|
|||
|
public void LoadAxiStatus(AxiEssgssStatusData data);
|
|||
|
public AxiEssgssStatusData SaveAxiStatus();
|
|||
|
}
|
|||
|
|
|||
|
internal static class AxiStatus
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊbyte[]
|
|||
|
public static byte[] ToByteArray<TEnum>(this TEnum[] enumArray) where TEnum : struct, Enum
|
|||
|
{
|
|||
|
if (!typeof(TEnum).IsEnum) throw new ArgumentException("TEnum must be an enumerated type");
|
|||
|
|
|||
|
// <20><>ȡö<C8A1>ٵĻ<D9B5><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>Int32<33><32>
|
|||
|
Type enumUnderlyingType = Enum.GetUnderlyingType(typeof(TEnum));
|
|||
|
if (enumUnderlyingType != typeof(byte)) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊbyte<74><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>byte<74><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>int<6E><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊbyte<74><65><EFBFBD>飬
|
|||
|
// <20><>Ҫע<D2AA>⣬<EFBFBD><E2A3AC><EFBFBD><EFBFBD><EFBFBD>ܻᵼ<DCBB><E1B5BC><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ʧ<EFBFBD><CAA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>byte<74>ķ<EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD>
|
|||
|
// һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>int[]<5D><><EFBFBD><EFBFBD>Ϊ<EFBFBD>м<EFBFBD><D0BC><EFBFBD>ʾ<EFBFBD><CABE>
|
|||
|
// <20><>Ϊ<EFBFBD>˼<EFBFBD><CBBC><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>ת<EFBFBD><D7AA>Ϊbyte<74><65>
|
|||
|
// <20><><EFBFBD>棺<EFBFBD><E6A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>int<6E><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB3A3><EFBFBD><EFBFBD>ö<EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD>ֱ<EFBFBD><D6B1>ת<EFBFBD><D7AA>ÿ<EFBFBD><C3BF>ö<EFBFBD><C3B6>ֵΪint<6E><74>
|
|||
|
// Ȼ<><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>ת<EFBFBD><D7AA>Ϊbyte<74><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD>ォ<EFBFBD>׳<EFBFBD><D7B3>쳣<EFBFBD><ECB3A3>
|
|||
|
return enumArray.Select(e =>
|
|||
|
{
|
|||
|
int intValue = Convert.ToInt32(e);
|
|||
|
if (intValue < byte.MinValue || intValue > byte.MaxValue)
|
|||
|
throw new OverflowException($"Enum value {e} ({intValue}) is out of range for byte.");
|
|||
|
return (byte)intValue;
|
|||
|
}).ToArray();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD>byte<74><65><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>ת<EFBFBD><D7AA>
|
|||
|
return Array.ConvertAll(enumArray, e => Convert.ToByte(e));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// <20><>byte[]ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
public static TEnum[] ToEnumArray<TEnum>(this byte[] byteArray) where TEnum : struct, Enum
|
|||
|
{
|
|||
|
if (!typeof(TEnum).IsEnum) throw new ArgumentException("TEnum must be an enumerated type");
|
|||
|
|
|||
|
// ֱ<><D6B1>ת<EFBFBD><D7AA>ÿ<EFBFBD><C3BF>byteΪö<CEAA><C3B6>ֵ
|
|||
|
return Array.ConvertAll(byteArray, b => (TEnum)Enum.ToObject(typeof(TEnum), b));
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>ת<EFBFBD><D7AA>Ϊbyte[]<5D><>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>̫<EFBFBD><CCAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>һ<EFBFBD><D2BB><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǻ<EFBFBD><C7BB><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
public static byte[] ToByteArray<TEnum>(this TEnum enumValue) where TEnum : struct, Enum
|
|||
|
{
|
|||
|
if (!typeof(TEnum).IsEnum) throw new ArgumentException("TEnum must be an enumerated type");
|
|||
|
|
|||
|
// <20><>ȡö<C8A1>ٵĻ<D9B5><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
Type enumUnderlyingType = Enum.GetUnderlyingType(typeof(TEnum));
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊbyte<74><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>ת<EFBFBD><D7AA>Ϊbyte<74><65><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>ö<EFBFBD>ٵĻ<D9B5><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>int<6E><74>
|
|||
|
if (enumUnderlyingType == typeof(byte))
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD>byte<74><65><EFBFBD><EFBFBD>ֱ<EFBFBD>ӷ<EFBFBD><D3B7>ذ<EFBFBD><D8B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
return new[] { Convert.ToByte(enumValue) };
|
|||
|
}
|
|||
|
else if (enumUnderlyingType == typeof(int)) // <20><EFBFBD><EEB3A3><EFBFBD><EFBFBD>ö<EFBFBD>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
// <20><>ö<EFBFBD><C3B6>ֵת<D6B5><D7AA>Ϊint<6E><74>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>ת<EFBFBD><D7AA>Ϊbyte
|
|||
|
int intValue = Convert.ToInt32(enumValue);
|
|||
|
if (intValue < byte.MinValue || intValue > byte.MaxValue)
|
|||
|
throw new OverflowException($"Enum value {enumValue} ({intValue}) is out of range for byte.");
|
|||
|
|
|||
|
// <20><><EFBFBD>ذ<EFBFBD><D8B0><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
return new[] { (byte)intValue };
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>byte<74><65>int<6E><74><EFBFBD><EFBFBD><EFBFBD>׳<EFBFBD><D7B3>쳣<EFBFBD><ECB3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD><EFBFBD><DFBC><EFBFBD>
|
|||
|
throw new NotSupportedException($"The underlying type of the enum {typeof(TEnum).Name} is not supported.");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// <20><>byte[]ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ö<EFBFBD>٣<EFBFBD><D9A3><EFBFBD><EFBFBD><EFBFBD>byte[]ֻ<><D6BB>һ<EFBFBD><D2BB><EFBFBD>ֽڣ<D6BD>
|
|||
|
public static TEnum ToEnum<TEnum>(this byte[] byteArray) where TEnum : struct, Enum
|
|||
|
{
|
|||
|
if (byteArray == null || byteArray.Length != 1)
|
|||
|
throw new ArgumentException("The byte array must contain exactly one byte.");
|
|||
|
|
|||
|
// ֱ<>Ӵ<EFBFBD><D3B4>ֽ<EFBFBD>ת<EFBFBD><D7AA>Ϊö<CEAA><C3B6>ֵ
|
|||
|
return (TEnum)Enum.ToObject(typeof(TEnum), byteArray[0]);
|
|||
|
}
|
|||
|
|
|||
|
// ushort[] ת byte[]
|
|||
|
public static byte[] ToByteArray(this ushort[] ushortArray)
|
|||
|
{
|
|||
|
byte[] byteArray = new byte[ushortArray.Length * 2];
|
|||
|
Buffer.BlockCopy(ushortArray, 0, byteArray, 0, byteArray.Length);
|
|||
|
return byteArray;
|
|||
|
}
|
|||
|
|
|||
|
// byte[] ת ushort[]
|
|||
|
public static ushort[] ToUShortArray(this byte[] byteArray)
|
|||
|
{
|
|||
|
if (byteArray.Length % 2 != 0)
|
|||
|
throw new ArgumentException("byte<74><65><EFBFBD>鳤<EFBFBD>ȱ<EFBFBD><C8B1><EFBFBD><EFBFBD><EFBFBD>ż<EFBFBD><C5BC>");
|
|||
|
|
|||
|
ushort[] ushortArray = new ushort[byteArray.Length / 2];
|
|||
|
Buffer.BlockCopy(byteArray, 0, ushortArray, 0, byteArray.Length);
|
|||
|
return ushortArray;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public static byte[] ToByteArray(this bool[] boolArr)
|
|||
|
{
|
|||
|
byte[] byteArray = new byte[boolArr.Length];
|
|||
|
for (int i = 0; i < byteArray.Length; i++)
|
|||
|
{
|
|||
|
byteArray[i] = (byte)(boolArr[i] ? 1 : 0);
|
|||
|
}
|
|||
|
return byteArray;
|
|||
|
}
|
|||
|
|
|||
|
public static bool[] ToBoolArray(this byte[] byteArray)
|
|||
|
{
|
|||
|
bool[] boolArr = new bool[byteArray.Length];
|
|||
|
for (int i = 0; i < byteArray.Length; i++)
|
|||
|
{
|
|||
|
boolArr[i] = byteArray[i] == 0 ? false : true;
|
|||
|
}
|
|||
|
return boolArr;
|
|||
|
}
|
|||
|
|
|||
|
public static byte[] FlattenByteArray2D(this byte[,] array2D)
|
|||
|
{
|
|||
|
int rows = array2D.GetLength(0);
|
|||
|
int cols = array2D.GetLength(1);
|
|||
|
byte[] array1D = new byte[rows * cols];
|
|||
|
|
|||
|
int index = 0;
|
|||
|
for (int i = 0; i < rows; i++)
|
|||
|
{
|
|||
|
for (int j = 0; j < cols; j++)
|
|||
|
{
|
|||
|
array1D[index++] = array2D[i, j];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return array1D;
|
|||
|
}
|
|||
|
public static byte[,] CreateByteArray2D(this byte[] array1D, int rows, int cols)
|
|||
|
{
|
|||
|
if (array1D.Length != rows * cols)
|
|||
|
{
|
|||
|
throw new ArgumentException("The length of the 1D array does not match the specified dimensions for the 2D array.");
|
|||
|
}
|
|||
|
|
|||
|
byte[,] array2D = new byte[rows, cols];
|
|||
|
|
|||
|
int index = 0;
|
|||
|
for (int i = 0; i < rows; i++)
|
|||
|
{
|
|||
|
for (int j = 0; j < cols; j++)
|
|||
|
{
|
|||
|
array2D[i, j] = array1D[index++];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return array2D;
|
|||
|
}
|
|||
|
}
|