private static BitArray Substring(BitArray input, int from, int count) { return new BitArray(input.OfType<bool>().Skip(from).Take(count).ToArray()); }
public void Write(byte[] bytes, int bitCount) { bytes = SwapEndianBytes(bytes); BitArray array = new BitArray(bytes); values.InsertRange(Position, array.OfType<bool>().Take(bitCount)); _Position += bitCount; }
/// <summary> /// Save bit array as bit set. /// </summary> /// <param name="bitArray">The bit array object.</param> /// <param name="writer">The writer object.</param> /// <returns>Bytes writen.</returns> private static int SaveBitSet(BitArray bitArray, BinaryWriter writer) { int bytesWritten = 0; writer.Write((int)SetType.BitSet); writer.Write((int)bitArray.Length); // size writer.Write((int)bitArray.OfType<bool>().Count(x => x)); // size bytesWritten += sizeof(int) * 3; // ((_unitSet.Length + 31) >> 5) * 4 // calculate the number of bytes to allocate to save // the bit set data. the data is INT (4 bytes) aligned byte[] data = new byte[((bitArray.Length + 31) >> 5) * 4]; bitArray.CopyTo(data, 0); writer.Write(data, 0, data.Length); bytesWritten += data.Length; return bytesWritten; }
/// <summary> /// Save bit array as index set. /// </summary> /// <param name="bitArray">The bit array object.</param> /// <param name="writer">The writer object.</param> /// <returns>Bytes writen.</returns> private static int SaveIndexSet(BitArray bitArray, BinaryWriter writer) { int bytesWritten = 0; writer.Write((int)SetType.IndexSet); writer.Write((int)bitArray.OfType<bool>().Count(x => x)); bytesWritten += sizeof(int) * 2; for (int i = 0; i < bitArray.Length; i++) { if (bitArray[i]) { writer.Write(i); bytesWritten += sizeof(int); } } return bytesWritten; }
public static int[] ToIntegers(BitArray bits) { return bits .OfType<bool>() .Select((v, i) => new { Group = i / 11, Value = v ? 1 << (10 - (i % 11)) : 0 }) .GroupBy(_ => _.Group, _ => _.Value) .Select(g => g.Sum()) .ToArray(); }