Advertisement
flmbray

Custom BitArray

Dec 25th, 2012
1,047
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.51 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Globalization;
  6. using System.Diagnostics;
  7.  
  8. namespace CryptoClass
  9. {
  10.     public class BitArray
  11.     {
  12.         private readonly bool[] bits;
  13.         public BitArray(IEnumerable<bool> bits)
  14.         {
  15.             this.bits = bits.ToArray();
  16.         }
  17.         public BitArray(int length)
  18.         {
  19.             this.bits = new bool[length];
  20.         }
  21.  
  22.         public int Length { get { return bits.Length; } }
  23.  
  24.         public static BitArray ParseHex(string hex)
  25.         {
  26.             if (hex == null) return null; // or do something else, throw, ...
  27.  
  28.             List<bool> bits = new List<bool>();
  29.             for (int i = 0; i < hex.Length; i++)
  30.             {
  31.                 int b = byte.Parse(hex[i].ToString(), NumberStyles.HexNumber);
  32.                 bits.Add((b >> 3) == 1);
  33.                 bits.Add(((b & 0x7) >> 2) == 1);
  34.                 bits.Add(((b & 0x3) >> 1) == 1);
  35.                 bits.Add((b & 0x1) == 1);
  36.             }
  37.             BitArray ba = new BitArray(bits.ToArray());
  38.             return ba;
  39.         }
  40.         public static BitArray FromBytes(IEnumerable<byte> bytes)
  41.         {
  42.             List<bool> bits = new List<bool>(bytes.Count() * 8);
  43.             foreach (byte b in bytes)
  44.             {
  45.                 byte v = b;
  46.                 for (int i = 7; i >= 0; i--)
  47.                 {
  48.                     bits.Add((v & (1 << i)) != 0);
  49.                 }
  50.             }
  51.             return new BitArray(bits);
  52.         }
  53.         public static BitArray operator +(BitArray a, BitArray b)
  54.         {
  55.             return a.Append(b);
  56.         }
  57.         public static BitArray FromByte(byte b)
  58.         {
  59.             return BitArray.FromBytes(new byte[] { b });
  60.         }
  61.         public static BitArray FromString(string s, Encoding encoding = null)
  62.         {
  63.             if (encoding == null) encoding = Encoding.ASCII;
  64.             return BitArray.FromBytes(encoding.GetBytes(s));
  65.         }
  66.  
  67.         public BitArray Append(BitArray bits)
  68.         {
  69.             List<bool> obits = new List<bool>(this.ToArray());
  70.             obits.AddRange(bits.ToArray());
  71.             return new BitArray(obits.ToArray());
  72.         }
  73.         public BitArray Repeat(int numReps)
  74.         {
  75.             BitArray dv = new BitArray(0);
  76.             while (--numReps >= 0) dv = dv.Append(this);
  77.             return dv;
  78.         }
  79.         public BitArray GetBits(int startBit, int numBits = -1)
  80.         {
  81.             if (numBits == -1) numBits = bits.Length;
  82.             return new BitArray(bits.Skip(startBit).Take(numBits).ToArray());
  83.         }
  84.         public BitArray SetBits(int startBit, BitArray setBits)
  85.         {
  86.             bool[] obits = bits.ToArray();
  87.             bool[] nbits = setBits.ToArray();
  88.             nbits.CopyTo(obits, startBit);
  89.             return new BitArray(obits);
  90.         }
  91.         public BitArray Increment(int v = 1)
  92.         {
  93.             byte[] bytes = ToBytes();
  94.             for (int i = bytes.Length - 1; i >= 0; i--)
  95.             {
  96.                 int nv = (int)bytes[i] + v;
  97.                 bytes[i] = (byte)(nv % 256);
  98.                 if (nv < 256) break;
  99.                 v = nv - 256;
  100.             }
  101.  
  102.             return BitArray.FromBytes(bytes);
  103.         }
  104.         public BitArray Left(int numBits)
  105.         {
  106.             return new BitArray(bits.Take(numBits));
  107.         }
  108.         public BitArray Xor(BitArray xor, int start = 0)
  109.         {
  110.             bool[] allbits = this.ToArray();
  111.             bool[] xorbits = xor.ToArray();
  112.             for (int i = 0; i < xorbits.Length; i++)
  113.             {
  114.                 if (start + i >= allbits.Length) break;
  115.  
  116.                 allbits[start + i] = allbits[start + i] ^ xorbits[i];
  117.             }
  118.             return new BitArray(allbits);
  119.         }
  120.         public List<BitArray> Split(int numBits)
  121.         {
  122.             int i = 0;
  123.             List<BitArray> bitSplits = new List<BitArray>();
  124.             while (i < bits.Length)
  125.             {
  126.                 bitSplits.Add(this.GetBits(i, numBits));
  127.                 i += numBits;
  128.             }
  129.             return bitSplits;
  130.         }
  131.  
  132.         public string ToAsciiString()
  133.         {
  134.             return Encoding.ASCII.GetString(ToBytes());
  135.         }
  136.         public string ToHexString(string bitSep8 = null, string bitSep128 = null)
  137.         {
  138.             string s = string.Empty;
  139.             int b = 0;
  140.  
  141.             for (int i = 1; i <= bits.Length; i++)
  142.             {
  143.                 b = (b << 1) | (bits[i-1] ? 1 : 0);
  144.                 if (i % 4 == 0)
  145.                 {
  146.                     s = s + string.Format("{0:x}", b);
  147.                     b = 0;
  148.                 }
  149.                
  150.                 if (i % (8 * 16) == 0)
  151.                 {
  152.                     s = s + bitSep128;
  153.                 }
  154.                 else if (i % 8 == 0)
  155.                 {
  156.                     s = s + bitSep8;
  157.                 }
  158.             }
  159.             int ebits = bits.Length % 4;
  160.             if (ebits != 0)
  161.             {
  162.                 b = b << (4 - ebits);
  163.                 s = s + string.Format("{0:x}", b);
  164.             }
  165.             return s;
  166.         }
  167.  
  168.         public override string ToString()
  169.         {
  170.             return ToHexString(" ", " | ");
  171.         }
  172.         public byte[] ToBytes(int startBit = 0, int numBits = -1)
  173.         {
  174.             if (numBits == -1) numBits = bits.Length - startBit;
  175.             BitArray ba = GetBits(startBit, numBits);
  176.             int nb = (numBits / 8) + (((numBits % 8) > 0) ? 1 : 0);
  177.             byte[] bb = new byte[nb];
  178.             for (int i = 0; i < ba.Length; i++)
  179.             {
  180.                 if (!bits[i]) continue;
  181.                 int bp = 7 - (i % 8);
  182.                 bb[i / 8] = (byte)((int)bb[i / 8] | (1 << bp));
  183.             }
  184.             return bb;
  185.         }
  186.         public bool[] ToArray()
  187.         {
  188.             return bits.ToArray();
  189.         }
  190.     }
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement