Blob未完成(待优化)

/**************************************************/
/*    Author   : Anby                            */
/*    Using    :兼容powerBuilder中的Blob数据类型 */
/*    DateTime :2013-08-04                       */
/*    版本     :未知,功能尚未完全实现           */
/**************************************************/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace BolbTools 
{
    public enum DateType { Date, Time, DateTime }
    public enum DataType { Boolean, Char, Date, DateTime, Decimal, Double, Int, String, Blob }
    public class Blob
    {
        #region 字段
        private List<byte> _arrList = new List<byte>();   //定义可变长的数组

        private double _maxLength = Math.Pow(2,32)-1;
        #endregion

        #region 属性
        public List<byte> ArrList
        {
            get { return _arrList; }
            set { _arrList = value; }
        }

        #endregion

        #region 方法

        /*获取str的char数组长度*/
        public static long Length(string str)
        {
           return str.ToCharArray().Length;    
        }
       
        /*获取blob对象的list长度   */
        public static long Length(Blob blob)
        {
            return blob._arrList.Count;
        }

        public void Add(byte b)
        {
            _arrList.Add(b);
        }
        


        public void InsertByte(int index,byte b)
        {
            _arrList.Insert(index,b);
        }

        public ulong InsertBlob(int index, Blob blob)
        {
            try
            {
                _arrList.InsertRange(index, blob._arrList);
            }
            catch (ArgumentOutOfRangeException ex)
            {
                for (int i = 0; i < index; i++)
                    _arrList.Add(0);
                _arrList.InsertRange(index, blob._arrList);
            }
            return (ulong)(blob._arrList.Count + index);
        }


        /*从blob对象中截取从n开始,到blob.length结尾的数据*/
        public Blob GetBlob(Blob blob, int n)
        {
          return  GetBlob(blob,n,blob._arrList.Count);
        }
        /*从blob对象中截取从n开始,到length长度的数据*/
        public Blob GetBlob(Blob blob, int n,int length)
        {
            //@TODO 获取n-length的blob对象

            //定义空的Blob对象
            Blob resultBlob = new Blob();

            //如果索引值超出blob的范围,那么返回一个空的Blob对象
            if (n > blob._arrList.Count)
            {
                return resultBlob;
            }
            //如果n+length>blob的长度,返回从n开始到blob.length的blob对象
            if ((n + length) > blob._arrList.Count)
            {
                for (int i = n; i < blob._arrList.Count; i++)
                    resultBlob._arrList.Add(blob._arrList[i]);
            }
            else //否则返回从n开始length长度的blob对象
            {
                for (int i = n; i < n+length; i++)
                    resultBlob._arrList.Add(blob._arrList[i]);
            }
            return resultBlob;

           

            return null;
        }




        public void RemoveAt(int index)
        {
            _arrList.RemoveAt(index);
        }



        /*将字符串转换为Bolb*/
        //Blob方法:将字符串转换为Blob对象--此方法中list不含有\0
        public static Blob  StrToBlob(string text)
        {
            Blob sub = new Blob();
            byte[] bytes = UnicodeEncoding.Default.GetBytes(text);
            foreach (byte b in bytes)
            {
                sub.Add(b);
            } 
            return sub;
        }

        public static string BlobToStr(Blob blob)
        {
            //如果blob中的数据list长度为空 返回null
            if (blob._arrList.Count == 0) return null;
             return  System.Text.UnicodeEncoding.Default.GetString(blob._arrList.ToArray());
        }




        public static ulong InsertBlob(ref Blob blob,int n,object data,DataType datatype)
        {
            Blob sub=new Blob();
            switch (datatype)
            {
                case DataType.Boolean:
                    sub= ConvertToBlob(bool.Parse(data.ToString()));
                    break;
                case DataType.Char:
                    sub=ConvertToBlob(char.Parse(data.ToString()));
                    break;
                case DataType.Decimal:
                    sub = ConvertToBlob(decimal.Parse(data.ToString()));
                    break;
                case DataType.Double:
                    sub=ConvertToBlob(double.Parse(data.ToString()));
                    break;
                case DataType.Int:
                    sub = ConvertToBlob(int.Parse(data.ToString()));
                    break;
                case DataType.String:
                    sub = ConvertToBlob(data.ToString());
                    break;
                case DataType.Blob:
                    sub = (Blob)data;
                    break;
            }
            return blob.InsertBlob(n, sub);
        }


        #region  ConvertToBlob重载
        /*将字符串转换为Blob*/
        public static Blob ConvertToBlob(string text)
        {
            Blob sub = new Blob();
            sub = StrToBlob(text);
            sub.Add(0);//由于字符串中含有终止位
            return sub;
        }

        /*将一个字节转为为Blob*/
        public static Blob ConvertToBlob(char charValue)
        {
            return StrToBlob(charValue.ToString());
        }

        /*将Bool型数据转换为Blob*/
        public static Blob ConvertToBlob(bool boolValue)
        {
            return StrToBlob(boolValue.ToString());
        }

        /*将日期型数据转换为Blob*/
        public static Blob ConvertToBlob(DateTime date, DateType type)
        {
            Blob sub = new Blob();
            switch (type)
            {
                case DateType.Date:
                    sub = StrToBlob(date.ToString("yyyy-MM-dd"));
                    break;
                case DateType.Time:
                    sub = StrToBlob(date.ToString("hh-mm-ss"));
                    break;
                default:
                    sub = StrToBlob(date.ToString("yyyy-MM-dd hh-mm-ss"));
                    break;
            }
            return sub;
        }

        /*将Double类型转换为Bolb*/
        public static Blob ConvertToBlob(double doubleValue)
        {
            return StrToBlob(doubleValue.ToString());
        }

        /*将Int类型转为Bolb*/
        public static Blob ConvertToBlob(int intValue)
        {
            return StrToBlob(intValue.ToString());
        }

        /*将decValue类型转为Bolb*/
        public static Blob ConvertToBlob(decimal decValue)
        {
            return StrToBlob(decValue.ToString());
        }
        #endregion


        #endregion

        #region 索引器
        /*定义索引器*/
        public byte this[int index]
        {
            get
            {   //检查索引范围
                if (index < 0 || index >= _maxLength)
                {
                    return 0;
                }
                else
                {
                    return _arrList[index];
                }
            }
            set
            {
                if (!(index <= 0))
                {
                    _arrList[index] = value;
                }
            }

        }
        #endregion

    
    }  

}
View Code

 

posted @ 2013-08-04 15:04  尼姑哪里跑  阅读(243)  评论(0编辑  收藏  举报