/// <summary> /// Calculates a set of transformations that reads reduced byte variable of size 'bits' shifted by 'bitOffset'. /// </summary> /// <returns>Set of byte transformations.</returns> /// <param name="bits">Number of bits of input data.</param> /// <param name="bitOffset">Number of bits by which input data is shifted.</param> private static TransformationDescriptor[] ByteInflate(byte bits, byte bitOffset) { if (bits == 0 || bits > 8) { throw new ArgumentOutOfRangeException("bits"); } if (bitOffset > 7) { throw new ArgumentOutOfRangeException("bitOffset"); } var result = new List <TransformationDescriptor>(); var bitsLeft = bits; var additionalShift = 0; while (bitsLeft > 0) { var currentBits = (byte)Math.Min(8 - bitOffset, bitsLeft); var mask = ((1 << currentBits) - 1) << (8 - bitOffset - currentBits); var shift = (sbyte)(-bitOffset + additionalShift); // optimization if ((mask >> shift) == (0xFF >> shift)) { mask = 0xFF; } var descriptor = new TransformationDescriptor(shift, (byte)mask, currentBits); result.Add(descriptor); bitOffset = 0; additionalShift += currentBits; bitsLeft -= currentBits; } return(result.ToArray()); }
/// <summary> /// Calculates a set of transformations that reads reduced byte variable of size 'bits' shifted by 'bitOffset'. /// </summary> /// <returns>Set of byte transformations.</returns> /// <param name="bits">Number of bits of input data.</param> /// <param name="bitOffset">Number of bits by which input data is shifted.</param> private static TransformationDescriptor[] ByteInflate(byte bits, byte bitOffset) { if(bits == 0 || bits > 8) { throw new ArgumentOutOfRangeException("bits"); } if(bitOffset > 7) { throw new ArgumentOutOfRangeException("bitOffset"); } var result = new List<TransformationDescriptor>(); var bitsLeft = bits; var additionalShift = 0; while(bitsLeft > 0) { var currentBits = (byte)Math.Min(8 - bitOffset, bitsLeft); var mask = ((1 << currentBits) - 1) << (8 - bitOffset - currentBits); var shift = (sbyte)(-bitOffset + additionalShift); // optimization if ((mask >> shift) == (0xFF >> shift)) { mask = 0xFF; } var descriptor = new TransformationDescriptor(shift, (byte)mask, currentBits); result.Add(descriptor); bitOffset = 0; additionalShift += currentBits; bitsLeft -= currentBits; } return result.ToArray(); }