using SWRIS.Enums;
using System;
using System.Text;
namespace SWRIS.Extensions
{
public class ByteTransform
{
#region Constructor
///
/// 实例化一个默认的对象
/// Instantiate a default object
///
public ByteTransform()
{
DataFormat = DataFormat.ABCD;
}
///
/// 使用指定的数据解析来实例化对象
/// Instantiate the object using the specified data parsing
///
/// 数据规则
public ByteTransform(DataFormat dataFormat)
{
this.DataFormat = dataFormat;
}
#endregion
#region Get Value From Bytes
///
public virtual bool TransBool(byte[] buffer, int index) => GetBoolByIndex(buffer, index);
///
public virtual bool[] TransBool(byte[] buffer, int index, int length)
{
bool[] result = new bool[length];
for (int i = 0; i < length; i++)
{
result[i] = GetBoolByIndex(buffer, i + index);
}
return result;
}
///
/// 获取Byte数组的第 boolIndex 偏移的bool值,这个偏移值可以为 10,就是第 1 个字节的 第3位
/// Get the bool value of the boolIndex offset of the Byte array. The offset value can be 10, which is the third bit of the first byte
///
/// 字节数组信息
/// 指定字节的位偏移
/// bool值
public static bool GetBoolByIndex(byte[] bytes, int boolIndex)
{
return SoftBasic.BoolOnByteIndex(bytes[boolIndex / 8], boolIndex % 8);
}
///
public virtual byte TransByte(byte[] buffer, int index) => buffer[index];
///
public virtual byte[] TransByte(byte[] buffer, int index, int length)
{
byte[] tmp = new byte[length];
Array.Copy(buffer, index, tmp, 0, length);
return tmp;
}
///
public virtual short TransInt16(byte[] buffer, int index) => BitConverter.ToInt16(ByteTransDataFormat2(buffer, index), 0);
///
public virtual short[] TransInt16(byte[] buffer, int index, int length)
{
short[] tmp = new short[length];
for (int i = 0; i < length; i++)
{
tmp[i] = TransInt16(buffer, index + 2 * i);
}
return tmp;
}
///
public short[,] TransInt16(byte[] buffer, int index, int row, int col)
{
return CreateTwoArrayFromOneArray(TransInt16(buffer, index, row * col), row, col);
}
///
public virtual ushort TransUInt16(byte[] buffer, int index) => BitConverter.ToUInt16(ByteTransDataFormat2(buffer, index), 0);
///
public virtual ushort[] TransUInt16(byte[] buffer, int index, int length)
{
ushort[] tmp = new ushort[length];
for (int i = 0; i < length; i++)
{
tmp[i] = TransUInt16(buffer, index + 2 * i);
}
return tmp;
}
///
public ushort[,] TransUInt16(byte[] buffer, int index, int row, int col)
{
return CreateTwoArrayFromOneArray(TransUInt16(buffer, index, row * col), row, col);
}
///
public virtual int TransInt32(byte[] buffer, int index) => BitConverter.ToInt32(ByteTransDataFormat4(buffer, index), 0);
///
public virtual int[] TransInt32(byte[] buffer, int index, int length)
{
int[] tmp = new int[length];
for (int i = 0; i < length; i++)
{
tmp[i] = TransInt32(buffer, index + 4 * i);
}
return tmp;
}
///
public int[,] TransInt32(byte[] buffer, int index, int row, int col)
{
return CreateTwoArrayFromOneArray(TransInt32(buffer, index, row * col), row, col);
}
///
public virtual uint TransUInt32(byte[] buffer, int index) => BitConverter.ToUInt32(ByteTransDataFormat4(buffer, index), 0);
///
public virtual uint[] TransUInt32(byte[] buffer, int index, int length)
{
uint[] tmp = new uint[length];
for (int i = 0; i < length; i++)
{
tmp[i] = TransUInt32(buffer, index + 4 * i);
}
return tmp;
}
///
public uint[,] TransUInt32(byte[] buffer, int index, int row, int col)
{
return CreateTwoArrayFromOneArray(TransUInt32(buffer, index, row * col), row, col);
}
///
public virtual long TransInt64(byte[] buffer, int index) => BitConverter.ToInt64(ByteTransDataFormat8(buffer, index), 0);
///
public virtual long[] TransInt64(byte[] buffer, int index, int length)
{
long[] tmp = new long[length];
for (int i = 0; i < length; i++)
{
tmp[i] = TransInt64(buffer, index + 8 * i);
}
return tmp;
}
///
public long[,] TransInt64(byte[] buffer, int index, int row, int col)
{
return CreateTwoArrayFromOneArray(TransInt64(buffer, index, row * col), row, col);
}
///
public virtual ulong TransUInt64(byte[] buffer, int index) => BitConverter.ToUInt64(ByteTransDataFormat8(buffer, index), 0);
///
public virtual ulong[] TransUInt64(byte[] buffer, int index, int length)
{
ulong[] tmp = new ulong[length];
for (int i = 0; i < length; i++)
{
tmp[i] = TransUInt64(buffer, index + 8 * i);
}
return tmp;
}
///
public ulong[,] TransUInt64(byte[] buffer, int index, int row, int col)
{
return CreateTwoArrayFromOneArray(TransUInt64(buffer, index, row * col), row, col);
}
///
public virtual float TransSingle(byte[] buffer, int index) => BitConverter.ToSingle(ByteTransDataFormat4(buffer, index), 0);
///
public virtual float[] TransSingle(byte[] buffer, int index, int length)
{
float[] tmp = new float[length];
for (int i = 0; i < length; i++)
{
tmp[i] = TransSingle(buffer, index + 4 * i);
}
return tmp;
}
///
public float[,] TransSingle(byte[] buffer, int index, int row, int col)
{
return CreateTwoArrayFromOneArray(TransSingle(buffer, index, row * col), row, col);
}
///
public virtual double TransDouble(byte[] buffer, int index) => BitConverter.ToDouble(ByteTransDataFormat8(buffer, index), 0);
///
public virtual double[] TransDouble(byte[] buffer, int index, int length)
{
double[] tmp = new double[length];
for (int i = 0; i < length; i++)
{
tmp[i] = TransDouble(buffer, index + 8 * i);
}
return tmp;
}
///
public double[,] TransDouble(byte[] buffer, int index, int row, int col)
{
return CreateTwoArrayFromOneArray(TransDouble(buffer, index, row * col), row, col);
}
///
public virtual string TransString(byte[] buffer, int index, int length, Encoding encoding)
{
byte[] tmp = TransByte(buffer, index, length);
if (IsStringReverseByteWord)
return encoding.GetString(SoftBasic.BytesReverseByWord(tmp));
else
return encoding.GetString(tmp);
}
///
/// 将一个一维数组中的所有数据按照行列信息拷贝到二维数组里,返回当前的二维数组
///
/// 数组的类型对象
/// 一维数组信息
/// 行
/// 列
public static T[,] CreateTwoArrayFromOneArray(T[] array, int row, int col)
{
T[,] twoArray = new T[row, col];
int count = 0;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
twoArray[i, j] = array[count];
count++;
}
}
return twoArray;
}
///
public virtual string TransString(byte[] buffer, Encoding encoding) => encoding.GetString(buffer);
#endregion
#region Get Bytes From Value
///
public virtual byte[] TransByte(bool value) => TransByte(new bool[] { value });
///
public virtual byte[] TransByte(bool[] values) => values == null ? null : SoftBasic.BoolArrayToByte(values);
///
public virtual byte[] TransByte(byte value) => new byte[] { value };
///
public virtual byte[] TransByte(short value) => TransByte(new short[] { value });
///
public virtual byte[] TransByte(short[] values)
{
if (values == null) return null;
byte[] buffer = new byte[values.Length * 2];
for (int i = 0; i < values.Length; i++)
{
ByteTransDataFormat2(BitConverter.GetBytes(values[i])).CopyTo(buffer, 2 * i);
}
return buffer;
}
///
public virtual byte[] TransByte(ushort value) => TransByte(new ushort[] { value });
///
public virtual byte[] TransByte(ushort[] values)
{
if (values == null) return null;
byte[] buffer = new byte[values.Length * 2];
for (int i = 0; i < values.Length; i++)
{
ByteTransDataFormat2(BitConverter.GetBytes(values[i])).CopyTo(buffer, 2 * i);
}
return buffer;
}
///
public virtual byte[] TransByte(int value) => TransByte(new int[] { value });
///
public virtual byte[] TransByte(int[] values)
{
if (values == null) return null;
byte[] buffer = new byte[values.Length * 4];
for (int i = 0; i < values.Length; i++)
{
ByteTransDataFormat4(BitConverter.GetBytes(values[i])).CopyTo(buffer, 4 * i);
}
return buffer;
}
///
public virtual byte[] TransByte(uint value) => TransByte(new uint[] { value });
///
public virtual byte[] TransByte(uint[] values)
{
if (values == null) return null;
byte[] buffer = new byte[values.Length * 4];
for (int i = 0; i < values.Length; i++)
{
ByteTransDataFormat4(BitConverter.GetBytes(values[i])).CopyTo(buffer, 4 * i);
}
return buffer;
}
///
public virtual byte[] TransByte(long value) => TransByte(new long[] { value });
///
public virtual byte[] TransByte(long[] values)
{
if (values == null) return null;
byte[] buffer = new byte[values.Length * 8];
for (int i = 0; i < values.Length; i++)
{
ByteTransDataFormat8(BitConverter.GetBytes(values[i])).CopyTo(buffer, 8 * i);
}
return buffer;
}
///
public virtual byte[] TransByte(ulong value) => TransByte(new ulong[] { value });
///
public virtual byte[] TransByte(ulong[] values)
{
if (values == null) return null;
byte[] buffer = new byte[values.Length * 8];
for (int i = 0; i < values.Length; i++)
{
ByteTransDataFormat8(BitConverter.GetBytes(values[i])).CopyTo(buffer, 8 * i);
}
return buffer;
}
///
public virtual byte[] TransByte(float value) => TransByte(new float[] { value });
///
public virtual byte[] TransByte(float[] values)
{
if (values == null) return null;
byte[] buffer = new byte[values.Length * 4];
for (int i = 0; i < values.Length; i++)
{
ByteTransDataFormat4(BitConverter.GetBytes(values[i])).CopyTo(buffer, 4 * i);
}
return buffer;
}
///
public virtual byte[] TransByte(double value) => TransByte(new double[] { value });
///
public virtual byte[] TransByte(double[] values)
{
if (values == null) return null;
byte[] buffer = new byte[values.Length * 8];
for (int i = 0; i < values.Length; i++)
{
ByteTransDataFormat8(BitConverter.GetBytes(values[i])).CopyTo(buffer, 8 * i);
}
return buffer;
}
///
public virtual byte[] TransByte(string value, Encoding encoding)
{
if (value == null) return null;
byte[] buffer = encoding.GetBytes(value);
return IsStringReverseByteWord ? SoftBasic.BytesReverseByWord(buffer) : buffer;
}
///
public virtual byte[] TransByte(string value, int length, Encoding encoding)
{
if (value == null) return null;
byte[] buffer = encoding.GetBytes(value);
return IsStringReverseByteWord ? SoftBasic.ArrayExpandToLength(SoftBasic.BytesReverseByWord(buffer), length) : SoftBasic.ArrayExpandToLength(buffer, length);
}
#endregion
#region DataFormat Support
///
/// 反转两个字节的数据信息
///
/// 原始字节数据
/// 起始的索引
/// 反转后的字节
protected virtual byte[] ByteTransDataFormat2(byte[] value, int index = 0)
{
byte[] buffer = new byte[2];
switch (DataFormat)
{
case DataFormat.ABCD:
case DataFormat.CDAB:
{
buffer[0] = value[index + 1];
buffer[1] = value[index + 0];
break;
}
case DataFormat.BADC:
case DataFormat.DCBA:
{
buffer[0] = value[index + 0];
buffer[1] = value[index + 1];
break;
}
}
return buffer;
}
///
/// 反转多字节的数据信息
///
/// 数据字节
/// 起始索引,默认值为0
/// 实际字节信息
protected virtual byte[] ByteTransDataFormat4(byte[] value, int index = 0)
{
byte[] buffer = new byte[4];
switch (DataFormat)
{
case DataFormat.ABCD:
{
buffer[0] = value[index + 3];
buffer[1] = value[index + 2];
buffer[2] = value[index + 1];
buffer[3] = value[index + 0];
break;
}
case DataFormat.BADC:
{
buffer[0] = value[index + 2];
buffer[1] = value[index + 3];
buffer[2] = value[index + 0];
buffer[3] = value[index + 1];
break;
}
case DataFormat.CDAB:
{
buffer[0] = value[index + 1];
buffer[1] = value[index + 0];
buffer[2] = value[index + 3];
buffer[3] = value[index + 2];
break;
}
case DataFormat.DCBA:
{
buffer[0] = value[index + 0];
buffer[1] = value[index + 1];
buffer[2] = value[index + 2];
buffer[3] = value[index + 3];
break;
}
}
return buffer;
}
///
/// 反转多字节的数据信息
///
/// 数据字节
/// 起始索引,默认值为0
/// 实际字节信息
protected virtual byte[] ByteTransDataFormat8(byte[] value, int index = 0)
{
byte[] buffer = new byte[8];
switch (DataFormat)
{
case DataFormat.ABCD:
{
buffer[0] = value[index + 7];
buffer[1] = value[index + 6];
buffer[2] = value[index + 5];
buffer[3] = value[index + 4];
buffer[4] = value[index + 3];
buffer[5] = value[index + 2];
buffer[6] = value[index + 1];
buffer[7] = value[index + 0];
break;
}
case DataFormat.BADC:
{
buffer[0] = value[index + 6];
buffer[1] = value[index + 7];
buffer[2] = value[index + 4];
buffer[3] = value[index + 5];
buffer[4] = value[index + 2];
buffer[5] = value[index + 3];
buffer[6] = value[index + 0];
buffer[7] = value[index + 1];
break;
}
case DataFormat.CDAB:
{
buffer[0] = value[index + 1];
buffer[1] = value[index + 0];
buffer[2] = value[index + 3];
buffer[3] = value[index + 2];
buffer[4] = value[index + 5];
buffer[5] = value[index + 4];
buffer[6] = value[index + 7];
buffer[7] = value[index + 6];
break;
}
case DataFormat.DCBA:
{
buffer[0] = value[index + 0];
buffer[1] = value[index + 1];
buffer[2] = value[index + 2];
buffer[3] = value[index + 3];
buffer[4] = value[index + 4];
buffer[5] = value[index + 5];
buffer[6] = value[index + 6];
buffer[7] = value[index + 7];
break;
}
}
return buffer;
}
#endregion
#region Public Properties
///
public DataFormat DataFormat { get; set; }
///
public bool IsStringReverseByteWord { get; set; }
#endregion
#region Object Override
///
public override string ToString() => $"RegularByteTransform[{DataFormat}]";
#endregion
}
}