使用 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();
        }
    }
}
当前页阅读量为: