2025-03-28 09:49:56 +08:00

245 lines
6.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
namespace SocketTransfer.SDK
{
public class Socket : IDisposable
{
/// <summary>
/// 分割Socket数据包
/// </summary>
/// <param name="buffer">Socket数据包</param>
/// <param name="phases">Socket片段定义</param>
/// <returns>Socket数据块</returns>
public static byte[][] Disperse(byte[] buffer, params int[] phases)
{
byte[][] target = new byte[phases.Length][];
int cursor = 0;
for (int i = 0; i < phases.Length; i++)
{
target[i] = new byte[phases[i]];
for (int j = 0; j < phases[i]; j++)
{
target[i][j] = buffer[cursor + j];
}
cursor += phases[i];
}
return target;
}
/// <summary>
/// 聚合Socket数据块
/// </summary>
/// <param name="buffer">Socket数据块</param>
/// <param name="phases">Socket片段定义</param>
/// <returns>Socket数据包</returns>
public static byte[] Aggregate(byte[][] buffer, params int[] phases)
{
byte[] target = new byte[phases.Sum()];
int cursor = 0;
for (int i = 0; i < phases.Length; i++)
{
for (int j = 0; j < phases[i]; j++)
{
target[cursor + j] = buffer[i][j];
}
cursor += phases[i];
}
return target;
}
#region => Phases <=
int[] _Phases;
/// <summary>
/// 数据段
/// </summary>
[Browsable(false)]
public int[] Phases
{
get
{
return _Phases;
}
}
#endregion
#region => Encoding <=
Encoding _Encoding;
/// <summary>
/// 编码规则
/// </summary>
[Browsable(false)]
public Encoding Encoding
{
get
{
return _Encoding;
}
}
#endregion
#region => Source <=
byte[] _Source;
/// <summary>
/// 数据包
/// </summary>
[Browsable(false)]
public byte[] Source
{
get
{
return _Source;
}
}
#endregion
#region => Socket <=
protected Socket(byte[] source, Encoding encoding, params int[] phases)
{
_Encoding = encoding;
_Phases = phases;
_Source = source;
}
#endregion
public virtual bool Valid()
{
if (_Phases.TakeWhile(p => p <= 0).Count() > 0)
{
return false;
}
return true;
}
#region SetValue
protected void SetValue(int index, string value)
{
SetValue(_Encoding, _Source, _Phases, index, value);
}
public static void SetValue(Encoding encoding, byte[] source, int[] phases, int index, string value)
{
try
{
int length = phases[index];
int start = phases.Take(index).Sum();
byte[] temp = value == null ? new byte[0] : encoding.GetBytes(value);
if (_Align)
{
for (int i = start; i < start + length; i++)
{
if (i - start < temp.Length)
{
source[i] = temp[i - start];
}
else
{
source[i] = temp.Length == 0 ? (byte)0 : _Space;
}
}
}
//else
//{
// for (int i = start + length - 1; i >= start; i--)
// {
// if (temp.Length + i - start - length >= 0)
// {
// source[i] = temp[temp.Length + i - start - length];
// }
// else
// {
// source[i] = temp.Length == 0 ? (byte)0 : _Space;
// }
// }
//}
}
catch (Exception e)
{
throw new Exception("SetValue Error!" + e.ToString());
}
}
#endregion
const byte _Space = 32;
const bool _Align = true;
#region GetValue
protected string GetValue(int index)
{
return GetValue(_Encoding, _Source, _Phases, index);
}
public static string GetValue(Encoding encoding, byte[] source, int[] phases, int index)
{
try
{
int length = phases[index];
int start = phases.Take(index).Sum();
byte[] temp = new byte[length];
for (int i = start; i < start + length; i++)
{
temp[i - start] = source[i];
}
return encoding.GetString(temp).Replace("\0", "").Trim();
}
catch (Exception e)
{
throw new Exception("GetValue Error!" + e.ToString());
}
}
#endregion
protected void RebuildSource()
{
bool flag = true;
for (int i = 0; i < _Source.Length; i++)
{
if (flag && _Source[_Source.Length - i - 1] == 0)
{
continue;
}
else
{
flag = false;
if (_Source[_Source.Length - i - 1] == 0)
_Source[_Source.Length - i - 1] = _Space;
}
}
}
protected void ExtendSource()
{
if (_Phases.Sum() > _Source.Length)
{
byte[] temp = new byte[_Phases.Sum()];
for (int i = 0; i < temp.Length; i++)
{
if (i < _Source.Length)
{
temp[i] = _Source[i];
}
else
{
temp[i] = 0;
}
}
_Source = temp;
}
}
public static int Length(byte[] source)
{
return source.Where(b => b != 0).Count();
}
#region Dispose
public void Dispose()
{
_Source = null;
_Phases = null;
_Encoding = null;
}
#endregion
}
}