stoneharry

Untitled

Sep 21st, 2013
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.17 KB | None | 0 0
  1. using System;
  2. using System.Text;
  3.  
  4. namespace AuthTest
  5. {
  6.     internal class BitWriter
  7.     {
  8.         private readonly byte[] _buffer;
  9.         private int _numBits;
  10.  
  11.         internal BitWriter(int capacity)
  12.         {
  13.             _buffer = new byte[capacity];
  14.         }
  15.  
  16.         internal byte[] Buffer
  17.         {
  18.             get { return _buffer; }
  19.         }
  20.  
  21.         internal int NumBits
  22.         {
  23.             get { return _numBits; }
  24.         }
  25.  
  26.         internal int Length
  27.         {
  28.             get
  29.             {
  30.                 int pos7 = (WritePos & 7);
  31.                 int bitsLeft = 8 - pos7;
  32.  
  33.                 if (bitsLeft == 0)
  34.                     return NumBits / 8;
  35.                 return (_numBits + bitsLeft)/8;
  36.             }
  37.         }
  38.  
  39.         internal int WritePos { get; set; }
  40.  
  41.         private static int Shift<T>(T left, int right)
  42.         {
  43.             if (typeof (T).Name == "Int32")
  44.                 return Convert.ToInt32(left) >> right;
  45.  
  46.             if (typeof (T).Name == "UInt32")
  47.                 return (int) (Convert.ToUInt32(left) >> right);
  48.  
  49.             return 0;
  50.         }
  51.  
  52.         private void AlignToNextByte()
  53.         {
  54.             WritePos = (WritePos + 7) & ~7;
  55.         }
  56.  
  57.         internal void WriteBytes( byte[] bytes )
  58.         {
  59.             AlignToNextByte();
  60.  
  61.             foreach (var b in bytes)
  62.             {
  63.                 WriteBits((int)b, 8);
  64.             }
  65.         }
  66.  
  67.         private void WriteBytes( byte[] bytes, int length )
  68.         {
  69.             var buf = new byte[length];
  70.             Array.Copy(bytes, 0, buf, 0, length);
  71.             WriteBytes(buf);
  72.         }
  73.  
  74.         public void WriteBuffer(byte[] bytes, int byteLength, int sizeBitCount)
  75.         {
  76.             WriteBits(byteLength, sizeBitCount);
  77.             WriteBytes(bytes, byteLength);
  78.         }
  79.  
  80.         internal void WriteInt32( int intVal )
  81.         {
  82.             WriteBits(intVal, 32);
  83.         }
  84.  
  85.         internal void WriteBits<T>(T valz, int numBits)
  86.         {
  87.             if (numBits > 0)
  88.             {
  89.                 _numBits += numBits;
  90.                 while (true)
  91.                 {
  92.                     int pos7 = (WritePos & 7);
  93.                     int unk = 8 - pos7;
  94.                     var lShift = (char) (1 << unk);
  95.                     int subNum;
  96.  
  97.                     if (unk < numBits)
  98.                         subNum = unk;
  99.                     else
  100.                     {
  101.                         lShift = (char) (1 << numBits);
  102.                         subNum = numBits;
  103.                     }
  104.  
  105.                     numBits -= subNum;
  106.  
  107.                     var firstHalf = (char) (~((lShift - 1) << pos7));
  108.  
  109.                     var shifted = (char) Shift(valz, numBits);
  110.                     var secondHalf = (char) (((lShift - 1) & shifted) << pos7);
  111.  
  112.                     Buffer[WritePos >> 3] = (byte) (Buffer[WritePos >> 3] & firstHalf | secondHalf);
  113.  
  114.                     WritePos += subNum;
  115.  
  116.                     if (numBits == 0)
  117.                         return;
  118.                 }
  119.             }
  120.         }
  121.  
  122.         internal void WriteFourCC(string fourCC)
  123.         {
  124.             byte[] arr = Encoding.ASCII.GetBytes(fourCC);
  125.             Array.Reverse(arr);
  126.  
  127.             if (arr.Length < 4)
  128.             {
  129.                 byte[] backup = arr;
  130.                 arr = new byte[arr.Length + 1];
  131.                 backup.CopyTo(arr, 0);
  132.             }
  133.             int test = BitConverter.ToInt32(arr, 0);
  134.             WriteInt32(BitConverter.ToInt32(arr,0));
  135.         }
  136.  
  137.         internal void WriteHeader( int packetId, int channelId )
  138.         {
  139.             WriteBits(packetId, 6);
  140.             WriteBits(1, 1);
  141.             WriteBits(channelId, 4);
  142.         }
  143.  
  144.         public override string ToString()
  145.         {
  146.             string str = "";
  147.             int numBytes = _numBits/8;
  148.  
  149.             if (_numBits % 8 > 0)
  150.                 numBytes++;
  151.  
  152.             for( int i = 0; i < numBytes; i++)
  153.             {
  154.                 if (i > 0 && i % 16 == 0)
  155.                     str += Environment.NewLine;
  156.  
  157.                 str += string.Format("{0:x2} ", Buffer[i]);
  158.             }
  159.             return str;
  160.         }
  161.     }
  162. }
Advertisement
Add Comment
Please, Sign In to add comment