使用 C# 實現 Bin 類,快速方便地管理 byte[] 類型
提示
這是 2007 年我初學編程時寫的文章,現在看來很多問題,但求搏君一笑。
使用 C# 實現 Bin 類,快速方便地管理 byte[] 類型一直是我的心願。因為在 C C++ C# VB 等語言中,byte[] 類型是常用的,但卻沒有太多方便的命令去處理它。因此我編寫了 Bin 類。這個類實現了方便的管理,封裝了大部分 Byte[] 操作,如添加、刪除、查找等。在編寫中注重速度、效率和方便性,支持索引器
\[index\]直接引用,操作符重載等。
同時這也是我寫的「ToEasy」C#簡單化代碼的一部分,namespace 就是 ToEasy 了!
下面就是我寫的代碼:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
/* Bin 操作類
* 版本:1.0
* --
* 歡迎訪問:http://ceeji.net (博客)
*
*/
namespace ToEasy
{
/// <summary>
/// 可以容納字節數組數據。簡化了對數據的操作。
/// </summary>
public class Bin
{
//字段
byte[] data = new byte[0];
//屬性
public Byte[] ByteArray
{
get
{
return this.data;
}
}
public int Length
{
get
{
return this.data.Length;
}
}
//隱式轉換
public static implicit operator Bin(byte[] from)
{
return new Bin(from);
}
public static implicit operator byte[] (Bin from)
{
return (byte[])from.data.Clone();
}
//運算
public static bool operator ==(Bin bin, byte[] o)
{
return bin.ByteArray == o;
}
public static bool operator !=(Bin bin, byte[] o)
{
return bin.ByteArray != o;
}
public static bool operator ==(byte[] o, Bin bin)
{
return bin == o;
}
public static bool operator !=(byte[] o, Bin bin)
{
return bin != o;
}
public static Bin operator +(Bin bin1, Bin bin2)
{
return bin1.GetAppend((byte[])bin2);
}
//索引器
public byte this[int index]
{
get
{
return this.GetByte(index);
}
set
{
this.data[index] = value;
}
}
//構造
public Bin()
{
}
public Bin(byte[] from)
{
this.FromByteArray(from);
}
public Bin(int length)
{
this.data = new byte[length];
}
//方法
public void Clear()
{
data = new byte[0];
}
public void FromByteArray(byte[] byteArray)
{
data = (byte[])byteArray.Clone();
}
public void FromFile(string fileName)
{
this.FromByteArray(File.ReadAllBytes(fileName));
}
/// <summary>
/// 向現在的字節集的末尾添加數據。
/// </summary>
/// <param name="append">字節集數據,可以為 byte[] 或 Bin.</param>
public void Append(byte[] append)
{
byte[] nbyte = new byte[this.Length + append.Length];
this.data.CopyTo(nbyte, 0);
append.CopyTo(nbyte, this.Length);
this.FromByteArray(nbyte);
}
public Bin GetAppend(byte[] append)
{
Bin bin = new Bin();
byte[] nbyte = new byte[this.Length + append.Length];
this.data.CopyTo(nbyte, 0);
append.CopyTo(nbyte, this.Length);
bin.FromByteArray(nbyte);
return bin;
}
public byte GetByte(int index)
{
return data[index];
}
public byte[] GetLeft(int length)
{
byte[] ret = new byte[length];
Array.Copy(data, 0, ret, 0, length);
return ret;
}
public byte[] GetData(int startIndex, int length)
{
byte[] ret = new byte[length];
Array.Copy(data, startIndex, ret, 0, length);
return ret;
}
public byte[] GetRight(int length)
{
byte[] ret = new byte[length];
Array.Copy(data, this.Length - length - 1, ret, 0, length);
return ret;
}
/// <summary>
/// 返回當前對象的字符串形式,例如 { 57, 46 }
/// </summary>
/// <returns></returns>
public override string ToString()
{
if (data.Length == 0)
{
return "{ }";
}
StringBuilder str = new StringBuilder("{ ");
foreach (byte each in data)
{
str.Append(each.ToString());
str.Append(", ");
}
str.Remove(str.Length - 2, 2);
str.Append(" }");
return str.ToString();
}
/// <summary>
/// 移除某項。這會很浪費時間,儘量不要這樣做。
/// </summary>
/// <param name="startindex"></param>
/// <param name="length"></param>
public void Remove(int startindex, int length)
{
if (length < 1)
{
return;
}
byte[] ndata = new byte[this.Length - length];
int j = 0;
for (int i = 0; i <= this.Length - 1; i++)
{
if ((i >= startindex & i < = startindex + length) == false)
{
ndata[j] = this[i];
j++;
}
}
this.data = (byte[])ndata.Clone();
}
/// <summary>
/// 在當前字節集中查找子字節集。如果找到則返回索引位置,否則返回 -1。
///
/// <param name="findbin">要找的數據</param>
/// <returns>索引位置</returns>
public int Find(Bin findbin)
{
byte[] b = findbin.ByteArray ;
int l = findbin.Length;
int z = this.Length - l + 1;
for (int i = 0; i < = z; i++)
{
if (findbin.GetData(i, l) == b)
{
return i;
}
}
return -1;
}
/// <summary>
/// 在當前字節集中從後向前查找子字節集。如果找到則返回索引位置,否則返回 -1。
///
/// <param name="findbin">要找的數據</param>
/// <returns>索引位置</returns>
public int FindLast(Bin findbin)
{
byte[] b = findbin.ByteArray;
int l = findbin.Length;
int z = this.Length - l + 1;
for (int i = z; i == 0; i--)
{
if (findbin.GetData(i, l) == b)
{
return i;
}
}
return -1;
}
/// <summary>
/// 執行替換。
/// </summary>
/// <param name="startindex">開始位置索引</param>
/// <param name="length">替換長度</param>
/// <param name="bin">替換成的數據</param>
public bool Replace(int startindex, int length, Bin bin)
{
if (startindex > this.Length - 1)//開始位置超標
{
return false;
}
if (startindex + length > this.Length)//結束位置超標
{
return false;
}
if (bin.Length < length)//提供數據不足
{
return false;
}
byte[] b = bin.ByteArray;
int j = 0;
for (int i = startindex; i <= startindex + length - 1; i++)
{
this.data[i] = b[j];
j++;
}
return true;
}
/// <summary>
/// 將當前字節集寫到指定的文件中。如果文件已存在,該文件將被覆蓋。
///
/// <param name="filename">文件名</param>
/// <param name="append">是否追加</param>
public void WriteToFile(string filename, bool append)
{
if (append == false)
{
File.WriteAllBytes(filename, this.ByteArray);
}
else
{
FileStream stream = new FileStream (filename,FileMode.Append );
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(this.ByteArray);
writer.Close();
stream.Close();
}
}
/// <summary>
/// 將當前字節集寫入文件基礎流。
/// </summary>
/// <param name="stream">文件基礎流</param>
public void WriteToFileStream(FileStream stream)
{
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(this.ByteArray);
writer.Close();
}
}
}
© 轉載需附帶本文連結,依 CC BY-NC-SA 4.0 釋出。