A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

       C#、Unity基于字节的网络通信中字节码解析类,类似java中的ByteBuffer,不过这个实现是参考的netty4中的ByteBuf类。
因为网络通道中是高字节序列,所以本类没有考虑低字节序列

  1. public class ByteBuffer
  2.     {
  3.         private byte[] buf;

  4.         private int readIndex = 0;
  5.         private int writeIndex = 0;
  6.         private int markReadIndex = 0;
  7.         private int markWirteIndex = 0;

  8.         private int capacity;

  9.         private ByteBuffer(int capacity)
  10.         {
  11.             buf = new byte[capacity];
  12.             this.capacity = capacity;
  13.         }

  14.         private ByteBuffer(byte[] bytes)
  15.         {
  16.             buf = bytes;
  17.             this.capacity = bytes.Length;
  18.         }

  19.         public static ByteBuffer Allocate(int capacity)
  20.         {
  21.             return new ByteBuffer(capacity);
  22.         }

  23.         public static ByteBuffer Allocate(byte[] bytes)
  24.         {
  25.             return new ByteBuffer(bytes);
  26.         }

  27.         public void Write(byte[] bytes)
  28.         {
  29.             int total = bytes.Length + writeIndex;
  30.             int len = buf.Length;
  31.             FixSizeAndReset(len, total);
  32.             for (int i = writeIndex, j = 0; i < total; i++, j++)
  33.             {
  34.                 buf[i] = bytes[j];
  35.             }
  36.             writeIndex = total;
  37.         }

  38.         private int FixLength(int length)
  39.         {
  40.             int n = 2;
  41.             int b = 2;
  42.             while( b < length) {
  43.                 b = 2 << n;
  44.                 n++;
  45.             }
  46.             return b;
  47.         }

  48.         private byte[] flip(byte[] bytes)
  49.         {
  50.             if (BitConverter.IsLittleEndian)
  51.             {
  52.                 Array.Reverse(bytes);
  53.             }
  54.             return bytes;
  55.         }

  56.         private int FixSizeAndReset(int currLen, int futureLen)
  57.         {
  58.             if (futureLen > currLen)
  59.             {
  60.                 byte[] newbuf = new byte[FixLength(currLen) * 2];
  61.                 Array.Copy(buf, 0, newbuf, 0, currLen);
  62.                 buf = newbuf;
  63.                 capacity = newbuf.Length;
  64.             }
  65.             return futureLen;
  66.         }

  67.         public void Write(ByteBuffer buffer)
  68.         {
  69.             if (buffer == null) return;
  70.             if (buffer.ReadableBytes() <= 0) return;
  71.             Write(buffer.ToArray());
  72.         }

  73.         public void WriteShort(short value)
  74.         {
  75.             Write(flip(BitConverter.GetBytes(value)));
  76.         }

  77.         public void WriteUshort(ushort value)
  78.         {
  79.             Write(flip(BitConverter.GetBytes(value)));
  80.         }

  81.         public void WriteInt(int value)
  82.         {
  83.             //byte[] array = new byte[4];
  84.             //for (int i = 3; i >= 0; i--)
  85.             //{
  86.             //    array[i] = (byte)(value & 0xff);
  87.             //    value = value >> 8;
  88.             //}
  89.             //Array.Reverse(array);
  90.             //Write(array);
  91.             Write(flip(BitConverter.GetBytes(value)));
  92.         }

  93.         public void WriteUint(uint value)
  94.         {
  95.             Write(flip(BitConverter.GetBytes(value)));
  96.         }

  97.         public void WriteLong(long value)
  98.         {
  99.             Write(flip(BitConverter.GetBytes(value)));
  100.         }

  101.         public void WriteUlong(ulong value)
  102.         {
  103.             Write(flip(BitConverter.GetBytes(value)));
  104.         }

  105.         public void WriteFloat(float value)
  106.         {
  107.             Write(flip(BitConverter.GetBytes(value)));
  108.         }

  109.         public void WriteByte(byte value)
  110.         {
  111.             int afterLen = writeIndex + 1;
  112.             int len = buf.Length;
  113.             FixSizeAndReset(len, afterLen);
  114.             buf[writeIndex] = value;
  115.             writeIndex = afterLen;
  116.         }

  117.         public void WriteDouble(double value)
  118.         {
  119.             Write(flip(BitConverter.GetBytes(value)));
  120.         }

  121.         public byte ReadByte()
  122.         {
  123.             byte b = buf[readIndex];
  124.             readIndex++;
  125.             return b;
  126.         }

  127.         public int ReadByteToInt()
  128.         {
  129.             return ReadByte();
  130.         }

  131.         private byte[] Read(int len)
  132.         {
  133.             byte[] bytes = new byte[len];
  134.             Array.Copy(buf, readIndex, bytes, 0, len);
  135.             if (BitConverter.IsLittleEndian)
  136.             {
  137.                 Array.Reverse(bytes);
  138.             }
  139.             readIndex += len;
  140.             return bytes;
  141.         }

  142.         public ushort ReadUshort()
  143.         {
  144.             return BitConverter.ToUInt16(Read(2), 0);
  145.         }

  146.         public short ReadShort()
  147.         {
  148.             return BitConverter.ToInt16(Read(2), 0);
  149.         }

  150.         public uint ReadUint()
  151.         {
  152.             return BitConverter.ToUInt32(Read(4), 0);
  153.         }

  154.         public int ReadInt()
  155.         {
  156.             return BitConverter.ToInt32(Read(4), 0);
  157.         }

  158.         public ulong ReadUlong()
  159.         {
  160.             return BitConverter.ToUInt64(Read(8), 0);
  161.         }

  162.         public long ReadLong()
  163.         {
  164.             return BitConverter.ToInt64(Read(8), 0);
  165.         }

  166.         public float ReadFloat()
  167.         {
  168.             return BitConverter.ToSingle(Read(4), 0);
  169.         }

  170.         public double ReadDouble()
  171.         {
  172.             return BitConverter.ToDouble(Read(8), 0);
  173.         }

  174.         public void ReadBytes(byte[] disbytes, int disstart, int len)
  175.         {
  176.             int size = disstart + len;
  177.             for (int i = disstart; i < size; i++)
  178.             {
  179.                 disbytes[i] = this.ReadByte();
  180.             }
  181.         }

  182.         public void DiscardReadBytes()
  183.         {
  184.             if(readIndex <= 0) return;
  185.             int len = buf.Length - readIndex;
  186.             byte[] newbuf = new byte[len];
  187.             Array.Copy(buf, readIndex, newbuf, 0, len);
  188.             buf = newbuf;
  189.             readIndex = 0;
  190.             writeIndex -= readIndex;
  191.             markReadIndex -= readIndex;
  192.             if (markReadIndex < 0)
  193.             {
  194.                 markReadIndex = readIndex;
  195.             }
  196.             markWirteIndex -= readIndex;
  197.             if (markWirteIndex < 0 || markWirteIndex < readIndex || markWirteIndex < markReadIndex)
  198.             {
  199.                 markWirteIndex = writeIndex;
  200.             }
  201.         }

  202.         public void Clear()
  203.         {
  204.             buf = new byte[buf.Length];
  205.             readIndex = 0;
  206.             writeIndex = 0;
  207.             markReadIndex = 0;
  208.             markWirteIndex = 0;
  209.         }

  210.         public void MarkReaderIndex()
  211.         {
  212.             markReadIndex = readIndex;
  213.         }

  214.         public void MarkWriterIndex()
  215.         {
  216.             markWirteIndex = writeIndex;
  217.         }

  218.         public void ResetReaderIndex()
  219.         {
  220.             readIndex = markReadIndex;
  221.         }

  222.         public void ResetWriterIndex()
  223.         {
  224.             writeIndex = markWirteIndex;
  225.         }

  226.         public int ReadableBytes()
  227.         {
  228.             return writeIndex - readIndex;
  229.         }

  230.         public byte[] ToArray()
  231.         {
  232.             byte[] bytes = new byte[writeIndex];
  233.             Array.Copy(buf, 0, bytes, 0, bytes.Length);
  234.             return bytes;
  235.         }

  236.         public int GetCapacity()
  237.         {
  238.             return this.capacity;
  239.         }
  240.     }
复制代码



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马