C#个人珍藏基础类库分享 — 4、字节数组帮助类BytesObjectHelper

这篇博客分享了一套C#开发者的基础类库,重点介绍了字节数组对象BytesObject的构造与操作方法,包括追加和前置字节、TLV(Tag-Length-Value)格式的处理。这些实用工具类适用于网络通信和数据打包场景,能够简化编码工作并提高效率。
摘要由CSDN通过智能技术生成

        做.NET开发的同学,一套简单易用的基础类库是必不可少的,这里把我混迹C#圈子十余载珍藏的类库分享出来,希望能够给刚踏入开发门槛的朋友一些帮助。

        后续我会逐步分享基础库的其余部分,先列个大纲:

C#个人珍藏基础类库分享 — 1、通用缓存帮助类CacheHelper
C#个人珍藏基础类库分享 — 2、Memcached缓存帮助类MemcachedHelper
C#个人珍藏基础类库分享 — 3、目录、文件帮助类FileHelper
C#个人珍藏基础类库分享 — 4、字节数组帮助类BytesObjectHelper
C#个人珍藏基础类库分享 — 5、日志帮助类LogHelper
C#个人珍藏基础类库分享 — 6、数据库处理帮助类SqlHelper
C#个人珍藏基础类库分享 — 7、Xml处理帮助类XmlHelper
C#个人珍藏基础类库分享 — 8、通用工具帮助类ToolHelper

         字节数组处理的需求相对较少,在功能机时代网络带宽小,为了节约传输成本HTTP报文都会采用TLV的形式进行打包,这时候字节数组帮助类就有了用武之地。

        下面开始进入正题:

1、构造函数

#region 构造函数

/// <summary>
/// 初始化字节数组对象。
/// </summary>
public BytesObject()
{
    _objLen = _jumpLen;
    _bytes = new byte[_jumpLen];
}

/// <summary>
/// 初始化字节数组对象,并指定数组的初始长度。
/// </summary>
/// <param name="initLength">初始长度</param>
public BytesObject(int initLength)
{
    if (initLength < 1)
        initLength = _jumpLen;

    _objLen = initLength;
    _bytes = new byte[initLength];
}

/// <summary>
/// 初始化字节数组对象,并指定数组的初始长度与自增长度。
/// </summary>
/// <param name="initLength">初始长度</param>
/// <param name="jumpLength">跳跃长度(当数组长度不够时,程序将根据该值对数组进行扩容)</param>
public BytesObject(int initLength, int jumpLength)
{
    if (initLength < 1)
        initLength = _jumpLen;
    if (jumpLength < 1)
        jumpLength = _jumpLen;

    _jumpLen = jumpLength;
    _objLen = initLength;
    _bytes = new byte[initLength];
}

/// <summary>
/// 初始化字节数组对象,并指定数组的初始长度、自增长度与默认使用的编码类型。
/// </summary>
/// <param name="initLength">初始长度</param>
/// <param name="jumpLength">跳跃长度(当数组长度不够时,程序将根据该值对数组进行扩容)</param>
/// <param name="encodingType">对象的编码类型,如常用的有:Unicode/UTF-8/UTF-16/GB2312/ASCII/...</param>
public BytesObject(int initLength, int jumpLength, Encoding encodingType)
{
    if (initLength < 1)
        initLength = _jumpLen;
    if (jumpLength < 1)
        jumpLength = _jumpLen;

    _jumpLen = jumpLength;
    _objLen = initLength;
    _encodingType = encodingType;
    _bytes = new byte[initLength];
}

/// <summary>
/// 初始化字节数组对象,并指定数组的默认编码类型。
/// </summary>
/// <param name="encodingType">对象的编码类型,如常用的有:Unicode/UTF-8/UTF-16/GB2312/ASCII/...</param>
public BytesObject(Encoding encodingType)
{
    _encodingType = encodingType;
    _bytes = new byte[_jumpLen];
}

#endregion

2、追加新的字节数组方法

#region AddBytes

/// <summary>
/// 追加新的字节数组
/// </summary>
/// <param name="bytes"></param>
public void AddBytes(byte[] bytes)
{
    addBytes(bytes);
}

/// <summary>
/// 追加新的字节数组(依据一个BytesObject对象)
/// </summary>
/// <param name="bo"></param>
public void AddBytes(BytesObject bo)
{
    addBytes(bo.Bytes);
}

/// <summary>
/// 追加新的字节数组(依据一个Int8,byte类型数据)
/// </summary>
/// <param name="bytesVal"></param>
public void AddBytes(byte bytesVal)
{
    byte[] bytes = new byte[1];
    bytes[0] = bytesVal;
    addBytes(bytes);
}

/// <summary>
/// 追加新的字节数组(依据一个UInt类型数据)
/// </summary>
/// <param name="bytesVal"></param>
public void AddBytes(uint bytesVal)
{
    byte[] bytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(bytesVal));
    addBytes(bytes);
}

/// <summary>
/// 追加新的字节数组(依据一个Int16类型数据)
/// </summary>
/// <param name="bytesVal"></param>
public void AddBytes(Int16 bytesVal)
{
    byte[] bytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(bytesVal));
    addBytes(bytes);
}

/// <summary>
/// 追加新的字节数组(依据一个Int32类型数据)
/// </summary>
/// <param name="bytesVal"></param>
public void AddBytes(Int32 bytesVal)
{
    byte[] bytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(bytesVal));
    addBytes(bytes);
}

/// <summary>
/// 追加新的字节数组(依据一个Int64,long类型数据)
/// </summary>
/// <param name="bytesVal"></param>
public void AddBytes(Int64 bytesVal)
{
    byte[] bytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((long)bytesVal));
    addBytes(bytes);
}

/// <summary>
/// 追加新的字节数组(依据String类型数据)
/// </summary>
/// <param name="bytesVal"></param>
public void AddBytes(string bytesVal)
{
    AddBytes(bytesVal, _encodingType, false);
}

/// <summary>
/// 追加新的字节数组(依据String类型数据,支持编码类型)
/// </summary>
/// <param name="bytesVal"></param>
/// <param name="encodingType">对象的编码类型,如常用的有:Unicode/UTF-8/UTF-16/GB2312/ASCII/...</param>
public void AddBytes(string bytesVal, Encoding encodingType)
{
    AddBytes(bytesVal, encodingType, false);
}

/// <summary>
/// 追加新的字节数组(依据String类型数据,可选择是否增加字节长度的定义)
/// </summary>
/// <param name="bytesVal"></param>
/// <param name="isVar"></param>
public void AddBytes(string bytesVal, bool isVar)
{
    AddBytes(bytesVal, _encodingType, isVar);
}

/// <summary>
/// 追加新的字节数组(依据String类型数据,支持编码类型,可选择是否增加字节长度的定义)
/// </summary>
/// <param name="bytesVal"></param>
/// <param name="encodingType">对象的编码类型,如常用的有:Unicode/UTF-8/UTF-16/GB2312/ASCII/...</param>
/// <param name="isVar"></param>
public void AddBytes(string bytesVal, Encoding encodingType, bool isVar)
{
    bytesVal = bytesVal ?? "";
    byte[] bytes = encodingType.GetBytes(bytesVal);
    if (isVar)
        addBytes(BitConverter.GetBytes(IPAddress.HostToNetworkOrder(bytes.Length)));
    addBytes(bytes);
}

#endregion

3、前置新的字节数组方法

#region PreBytes

/// <summary>
/// 前置新的字节数组
/// </summary>
/// <param name="bytes"></param>
public void PreBytes(byte[] bytes)
{
    preBytes(bytes);
}

/// <summary>
/// 追加新的字节数组(依据一个BytesObject对象)
/// </summary>
/// <param name="bo"></param>
public void PreBytes(BytesObject bo)
{
    preBytes(bo.Bytes);
}

/// <summary>
/// 前置新的字节数组(依据一个Int8,byte类型数据)
/// </summary>
/// <param name="bytesVal"></param>
public void PreBytes(byte bytesVal)
{
    byte[] bytes = new byte[1];
    bytes[0] = bytesVal;
    preBytes(bytes);
}

/// <summary>
/// 前置新的字节数组(依据一个UInt类型数据)
/// </summary>
/// <param name="bytesVal"></param>
public void PreBytes(uint bytesVal)
{
    byte[] bytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(bytesVal));
    preBytes(bytes);
}

/// <summary>
/// 前置新的字节数组(依据一个Int16类型数据)
/// </summary>
/// <param name="bytesVal"></param>
public void PreBytes(Int16 bytesVal)
{
    byte[] bytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(bytesVal));
    preBytes(bytes);
}

/// <summary>
/// 前置新的字节数组(依据一个Int32类型数据)
/// </summary>
/// <param name="bytesVal"></param>
public void PreBytes(Int32 bytesVal)
{
    byte[] bytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(bytesVal));
    preBytes(bytes);
}

/// <summary>
/// 前置新的字节数组(依据一个Int64,long类型数据)
/// </summary>
/// <param name="bytesVal"></param>
public void PreBytes(Int64 bytesVal)
{
    byte[] bytes = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(bytesVal));
    preBytes(bytes);
}

/// <summary>
/// 前置新的字节数组(依据String类型数据)
/// </summary>
/// <param name="bytesVal"></param>
public void PreBytes(string bytesVal)
{
    PreBytes(bytesVal, _encodingType, false);
}

/// <summary>
/// 前置新的字节数组(依据String类型数据,支持编码类型)
/// </summary>
/// <param name="bytesVal"></param>
/// <param name="encodingType">对象的编码类型,如常用的有:Unicode/UTF-8/UTF-16/GB2312/ASCII/...</param>
public void PreBytes(string bytesVal, Encoding encodingType)
{
    PreBytes(bytesVal, encodingType, false);
}

/// <summary>
/// 前置新的字节数组(依据String类型数据,可选择是否增加字节长度的定义)
/// </summary>
/// <param name="bytesVal"></param>
/// <param name="isVar"></param>
public void PreBytes(string bytesVal, bool isVar)
{
    PreBytes(bytesVal, _encodingType, isVar);
}

/// <summary>
/// 前置新的字节数组(依据String类型数据,支持编码类型,可选择是否增加字节长度的定义)
/// </summary>
/// <param name="bytesVal"></param>
/// <param name="encodingType">对象的编码类型,如常用的有:Unicode/UTF-8/UTF-16/GB2312/ASCII/...</param>
/// <param name="isVar"></param>
public void PreBytes(string bytesVal, Encoding encodingType, bool isVar)
{
    bytesVal = bytesVal ?? "";
    byte[] bytes = encodingType.GetBytes(bytesVal);
    preBytes(bytes);
    if (isVar)
        preBytes(BitConverter.GetBytes(IPAddress.HostToNetworkOrder(bytes.Length)));
}

#endregion

4、追加TLV方法

#region AddTLV

/// <summary>
/// 追加TLV(byte数据)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
public void AddTLV(int t, byte[] v)
{
    AddBytes(t);
    AddBytes(v.Length);
    AddBytes(v);
}

/// <summary>
/// 追加TLV(BytesObject对象)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
public void AddTLV(int t, BytesObject v)
{
    byte[] bytes = v.Bytes;
    AddBytes(t);
    AddBytes(bytes.Length);
    AddBytes(bytes);
}

/// <summary>
/// 追加TLV(Int8,byte类型值)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
public void AddTLV(int t, byte v)
{
    AddBytes(t);
    AddBytes(0x01);
    AddBytes(v);
}

/// <summary>
/// 追加TLV(uint类型值)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
public void AddTLV(int t, uint v)
{
    AddBytes(t);
    AddBytes(0x04);
    AddBytes(v);
}

/// <summary>
/// 追加TLV(Int16类型值)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
public void AddTLV(int t, Int16 v)
{
    AddBytes(t);
    AddBytes(0x02);
    AddBytes(v);
}

/// <summary>
/// 追加TLV(Int32类型值)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
public void AddTLV(int t, Int32 v)
{
    AddBytes(t);
    AddBytes(0x04);
    AddBytes(v);
}

/// <summary>
/// 追加TLV(Int64,long类型值)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
public void AddTLV(int t, Int64 v)
{
    AddBytes(t);
    AddBytes(0x08);
    AddBytes(v);
}

/// <summary>
/// 追加TLV(String类型值)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
public void AddTLV(int t, string v)
{
    AddBytes(t);
    AddBytes(v, _encodingType, true);
}

/// <summary>
/// 追加TLV(String类型值,支持编码类型)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
/// <param name="encodingType">对象的编码类型,,如常用的有:Unicode/UTF-8/UTF-16/GB2312/ASCII/...</param>
public void AddTLV(int t, string v, Encoding encodingType)
{
    AddBytes(t);
    AddBytes(v, encodingType, true);
}

#endregion

5、前置TLV方法

#region PreTLV

/// <summary>
/// 前置TLV(byte数据)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
public void PreTLV(int t, byte[] v)
{
    PreBytes(v);
    PreBytes(v.Length);
    PreBytes(t);
}

/// <summary>
/// 前置TLV(BytesObject对象)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
public void PreTLV(int t, BytesObject v)
{
    byte[] bytes = v.Bytes;
    PreBytes(bytes);
    PreBytes(bytes.Length);
    PreBytes(t);
}

/// <summary>
/// 前置TLV(Int8,byte类型值)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
public void PreTLV(int t, byte v)
{
    PreBytes(v);
    PreBytes(0x01);
    PreBytes(t);
}

/// <summary>
/// 前置TLV(uint类型值)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
public void PreTLV(int t, uint v)
{
    PreBytes(v);
    PreBytes(0x04);
    PreBytes(t);
}

/// <summary>
/// 前置TLV(Int16类型值)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
public void PreTLV(int t, Int16 v)
{
    PreBytes(v);
    PreBytes(0x02);
    PreBytes(t);
}

/// <summary>
/// 前置TLV(Int32类型值)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
public void PreTLV(int t, Int32 v)
{
    PreBytes(v);
    PreBytes(0x04);
    PreBytes(t);
}

/// <summary>
/// 前置TLV(Int64,long类型值)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
public void PreTLV(int t, Int64 v)
{
    PreBytes(v);
    PreBytes(0x08);
    PreBytes(t);
}

/// <summary>
/// 前置TLV(String类型值)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
public void PreTLV(int t, string v)
{
    PreBytes(v, _encodingType, true);
    PreBytes(t);
}

/// <summary>
/// 前置TLV(String类型值,支持编码类型)
/// </summary>
/// <param name="t"></param>
/// <param name="v"></param>
/// <param name="encodingType">对象的编码类型,,如常用的有:Unicode/UTF-8/UTF-16/GB2312/ASCII/...</param>
public void PreTLV(int t, string v, Encoding encodingType)
{
    PreBytes(v, encodingType, true);
    PreBytes(t);
}

#endregion

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MarcoPro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值