查看: 1268|回复: 3
打印 上一主题 下一主题

[其他] ByteArrary(优化数据存储和数据流)

[复制链接]

2722

主题

42

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
38268
精华
111

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-9-29 02:02:51 |只看该作者 |倒序浏览
  1. public class ByteArray
  2. {
  3.     private MemoryStream m_Stream = new MemoryStream();
  4.     private BinaryReader m_Reader = null;
  5.     private BinaryWriter m_Writer = null;

  6.     public ByteArray()
  7.     {
  8.         Init();
  9.     }

  10.     public ByteArray(MemoryStream ms)
  11.     {
  12.         m_Stream = ms;
  13.         Init();
  14.     }

  15.     public ByteArray(byte[] buffer)
  16.     {
  17.         m_Stream = new MemoryStream(buffer);
  18.         Init();
  19.     }

  20.     private void Init()
  21.     {
  22.         m_Writer = new BinaryWriter(m_Stream);
  23.         m_Reader = new BinaryReader(m_Stream);
  24.     }

  25.     public int Length
  26.     {
  27.         get { return (int)m_Stream.Length; }
  28.     }

  29.     public int Postion
  30.     {
  31.         get { return (int)m_Stream.Position; }
  32.         set { m_Stream.Position = value; }
  33.     }

  34.     public byte[] Buffer
  35.     {
  36.         get { return m_Stream.GetBuffer(); }
  37.     }

  38.     internal MemoryStream MemoryStream { get { return m_Stream; } }

  39.     public bool ReadBoolean()
  40.     {
  41.         return m_Reader.ReadBoolean();
  42.     }

  43.     public byte ReadByte()
  44.     {
  45.         return m_Reader.ReadByte();
  46.     }

  47.     public void ReadBytes(byte[] bytes, uint offset, uint length)
  48.     {
  49.         byte[] tmp = m_Reader.ReadBytes((int)length);
  50.         for (int i = 0; i < tmp.Length; i++)
  51.             bytes[i + offset] = tmp[i];
  52.         //m_Reader.ReadBytes(bytes, offset, length);
  53.     }

  54.     public double ReadDouble()
  55.     {
  56.         return m_Reader.ReadDouble();
  57.     }

  58.     public float ReadFloat()
  59.     {
  60.         byte[] bytes = m_Reader.ReadBytes(4);
  61.         byte[] invertedBytes = new byte[4];
  62.         //Grab the bytes in reverse order from the backwards index
  63.         for (int i = 3, j = 0; i >= 0; i--, j++)
  64.         {
  65.             invertedBytes[j] = bytes[i];
  66.         }
  67.         float value = BitConverter.ToSingle(invertedBytes, 0);
  68.         return value;

  69.         // return m_Reader.ReadFloat();
  70.     }

  71.     public int ReadInt()
  72.     {
  73.         return m_Reader.ReadInt32();
  74.     }

  75.     public short ReadShort()
  76.     {
  77.         return m_Reader.ReadInt16();
  78.     }

  79.     public byte ReadUnsignedByte()
  80.     {
  81.         return m_Reader.ReadByte();
  82.     }

  83.     public uint ReadUnsignedInt()
  84.     {
  85.         return (uint)m_Reader.ReadInt32();
  86.     }

  87.     public ushort ReadUnsignedShort()
  88.     {
  89.         return m_Reader.ReadUInt16();
  90.     }

  91.     public string ReadUTF()
  92.     {
  93.         return m_Reader.ReadString();
  94.     }

  95.     public string ReadUTFBytes(uint length)
  96.     {
  97.         if (length == 0)
  98.             return string.Empty;
  99.         UTF8Encoding utf8 = new UTF8Encoding(false, true);
  100.         byte[] encodedBytes = m_Reader.ReadBytes((int)length);
  101.         string decodedString = utf8.GetString(encodedBytes, 0, encodedBytes.Length);
  102.         return decodedString;
  103.     }

  104.     public void WriteBoolean(bool value)
  105.     {
  106.         m_Writer.BaseStream.WriteByte(value ? ((byte)1) : ((byte)0));
  107.         // m_Writer.WriteBoolean(value);
  108.     }
  109.     public void WriteByte(byte value)
  110.     {
  111.         m_Writer.BaseStream.WriteByte(value);
  112.         // m_Writer.WriteByte(value);
  113.     }
  114.     public void WriteBytes(byte[] buffer)
  115.     {
  116.         for (int i = 0; buffer != null && i < buffer.Length; i++)
  117.             m_Writer.BaseStream.WriteByte(buffer[i]);
  118.     }
  119.     public void WriteBytes(byte[] bytes, int offset, int length)
  120.     {
  121.         for (int i = offset; i < offset + length; i++)
  122.             m_Writer.BaseStream.WriteByte(bytes[i]);
  123.     }
  124.     public void WriteDouble(double value)
  125.     {
  126.         byte[] bytes = BitConverter.GetBytes(value);
  127.         WriteBigEndian(bytes);
  128.     }
  129.     public void WriteFloat(float value)
  130.     {
  131.         byte[] bytes = BitConverter.GetBytes(value);
  132.         WriteBigEndian(bytes);
  133.     }
  134.     private void WriteBigEndian(byte[] bytes)
  135.     {
  136.         if (bytes == null)
  137.             return;
  138.         for (int i = bytes.Length - 1; i >= 0; i--)
  139.         {
  140.             m_Writer.BaseStream.WriteByte(bytes[i]);
  141.         }
  142.     }

  143.     public void WriteInt32(int value)
  144.     {
  145.         byte[] bytes = BitConverter.GetBytes(value);
  146.         WriteBigEndian(bytes);
  147.     }

  148.     public void WriteInt(int value)
  149.     {
  150.         WriteInt32(value);
  151.     }

  152.     public void WriteShort(int value)
  153.     {
  154.         byte[] bytes = BitConverter.GetBytes((ushort)value);
  155.         WriteBigEndian(bytes);
  156.     }

  157.     public void WriteUnsignedInt(uint value)
  158.     {
  159.         WriteInt32((int)value);
  160.     }

  161.     public void WriteUTF(string value)
  162.     {
  163.         UTF8Encoding utf8Encoding = new UTF8Encoding();
  164.         int byteCount = utf8Encoding.GetByteCount(value);
  165.         byte[] buffer = utf8Encoding.GetBytes(value);
  166.         WriteShort(byteCount);
  167.         if (buffer.Length > 0)
  168.             m_Writer.Write(buffer);
  169.     }

  170.     public void WriteUTFBytes(string value)
  171.     {
  172.         UTF8Encoding utf8Encoding = new UTF8Encoding();
  173.         byte[] buffer = utf8Encoding.GetBytes(value);
  174.         if (buffer.Length > 0)
  175.             m_Writer.Write(buffer);
  176.     }

  177.     public void WriteStringBytes(string value)
  178.     {
  179.         UTF8Encoding utf8Encoding = new UTF8Encoding();
  180.         byte[] buffer = utf8Encoding.GetBytes(value);
  181.         if (buffer.Length > 0)
  182.         {
  183.             m_Writer.Write(buffer.Length);
  184.             m_Writer.Write(buffer);
  185.         }
  186.     }
  187. }
复制代码
ByteArray()
创建一个表示填充的字节数组的 ByteArray 实例,以便使用此类中的方法和属性来优化数据存储和数据流。 ByteArray
compress(algorithm:String):void
压缩字节数组。 ByteArray
hasOwnProperty(name:String):Boolean
指示对象是否已经定义了指定的属性。 Object
isPrototypeOf(theClass:Object):Boolean
指示 Object 类的实例是否在指定为参数的对象的原型链中。 Object
propertyIsEnumerable(name:String):Boolean
指示指定的属性是否存在、是否可枚举。 Object
readBoolean():Boolean
从字节流中读取布尔值。 ByteArray
readByte():int
从字节流中读取带符号的字节。 ByteArray
readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
从字节流中读取 length 参数指定的数据字节数。 ByteArray
readDouble():Number
从字节流中读取一个 IEEE 754 双精度(64 位)浮点数。 ByteArray
readFloat():Number
从字节流中读取一个 IEEE 754 单精度(32 位)浮点数。 ByteArray
readInt():int
从字节流中读取一个带符号的 32 位整数。 ByteArray
readMultiByte(length:uint, charSet:String):String
使用指定的字符集从字节流中读取指定长度的多字节字符串。 ByteArray
readObject():*
从字节数组中读取一个以 AMF 序列化格式进行编码的对象。 ByteArray
readShort():int
从字节流中读取一个带符号的 16 位整数。 ByteArray
readUnsignedByte():uint
从字节流中读取无符号的字节。 ByteArray
readUnsignedInt():uint
从字节流中读取一个无符号的 32 位整数。 ByteArray
readUnsignedShort():uint
从字节流中读取一个无符号的 16 位整数。 ByteArray
readUTF():String
从字节流中读取一个 UTF-8 字符串。 ByteArray
readUTFBytes(length:uint):String
从字节流中读取一个由 length 参数指定的 UTF-8 字节序列,并返回一个字符串。 ByteArray
setPropertyIsEnumerable(name:String, isEnum:Boolean = true):void
设置循环操作动态属性的可用性。 Object
toString():String
将字节数组转换为字符串。 ByteArray
uncompress(algorithm:String):void
解压缩字节数组。 ByteArray
valueOf():Object
返回指定对象的原始值。 Object
writeBoolean(value:Boolean):void
写入布尔值。 ByteArray
writeByte(value:int):void
在字节流中写入一个字节。 ByteArray
writeBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
将指定字节数组 bytes(起始偏移量为 bytes,从 0 开始的索引)中包含 length 个字节的字节序列写入字节流。 ByteArray
writeDouble(value:Number):void
在字节流中写入一个 IEEE 754 双精度(64 位)浮点数。 ByteArray
writeFloat(value:Number):void
在字节流中写入一个 IEEE 754 单精度(32 位)浮点数。 ByteArray
writeInt(value:int):void
在字节流中写入一个带符号的 32 位整数。 ByteArray
writeMultiByte(value:String, charSet:String):void
使用指定的字符集将多字节字符串写入字节流。 ByteArray
writeObject(object:*):void
将对象以 AMF 序列化格式写入字节数组。 ByteArray
writeShort(value:int):void
在字节流中写入一个 16 位整数。 ByteArray
writeUnsignedInt(value:uint):void
在字节流中写入一个无符号的 32 位整数。 ByteArray
writeUTF(value:String):void
将 UTF-8 字符串写入字节流。 ByteArray
writeUTFBytes(value:String):void
将 UTF-8 字符串写入字节流。 ByteArray
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-10-2 07:08:38 |只看该作者
Thanks for code share 1!
回复

使用道具 举报

115

主题

3

听众

5676

积分

高级设计师

Rank: 6Rank: 6

纳金币
7268
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2014-10-2 09:34:22 |只看该作者
谢谢提醒与指导
回复

使用道具 举报

0

主题

2

听众

1346

积分

助理设计师

Rank: 4

纳金币
505
精华
0
地板
发表于 2014-10-2 18:31:02 |只看该作者
谢谢指导 高层次的技术与技巧水平
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-29 09:40 , Processed in 0.097606 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部