protected override BitStream InternalValueToBitStream() { ulong bits; dynamic value = GetNumber(InternalValue); if (value > 0 && (ulong)value > MaxValue) { string msg = string.Format("Error, {0} value '{1}' is greater than the maximum {2}-bit {3} number.", debugName, value, lengthAsBits, Signed ? "signed" : "unsigned"); var inner = new OverflowException(msg); throw new SoftException(inner); } if (value < 0 && (long)value < MinValue) { string msg = string.Format("Error, {0} value '{1}' is less than the minimum {2}-bit {3} number.", debugName, value, lengthAsBits, Signed ? "signed" : "unsigned"); var inner = new OverflowException(msg); throw new SoftException(inner); } if (LittleEndian) { bits = LittleBitWriter.GetBits(value, (int)lengthAsBits); } else { bits = BigBitWriter.GetBits(value, (int)lengthAsBits); } var bs = new BitStream(); bs.WriteBits(bits, (int)lengthAsBits); return(bs); }
private dynamic FromBitstream(BitStream bs) { ulong bits = bs.ReadBits((int)lengthAsBits); if (Signed) { if (LittleEndian) { return(LittleBitWriter.GetInt64(bits, (int)lengthAsBits)); } else { return(BigBitWriter.GetInt64(bits, (int)lengthAsBits)); } } else { if (LittleEndian) { return(LittleBitWriter.GetUInt64(bits, (int)lengthAsBits)); } else { return(BigBitWriter.GetUInt64(bits, (int)lengthAsBits)); } } }
public void BitConverter() { /* * Unsigned, BE, 12bit "A B C" -> 0x0ABC -> 2748 * Signed , BE, 12bit "A B C" -> 0xFABC -> -1348 * Unsigned, LE, 12bit "B C A" -> 0x0ABC -> 2748 * Signed , LE, 12bit "B C A" -> 0xFABC -> -1348 */ byte[] val = null; val = BitWriter <BigEndian> .GetBytes(0xABC, 0); Assert.AreEqual(new byte[] { }, val); Assert.AreEqual(0, BigBitWriter.GetUInt64(val, 0)); Assert.AreEqual(0, BigBitWriter.GetInt64(val, 0)); val = BitWriter <BigEndian> .GetBytes(0xABC, 12); Assert.AreEqual(new byte[] { 0xab, 0xc0 }, val); Assert.AreEqual(2748, BigBitWriter.GetUInt64(val, 12)); Assert.AreEqual(-1348, BigBitWriter.GetInt64(val, 12)); val = BitWriter <LittleEndian> .GetBytes(0xABC, 0); Assert.AreEqual(new byte[] { }, val); Assert.AreEqual(0, LittleBitWriter.GetUInt64(val, 0)); Assert.AreEqual(0, LittleBitWriter.GetInt64(val, 0)); val = BitWriter <LittleEndian> .GetBytes(0xABC, 12); Assert.AreEqual(new byte[] { 0xbc, 0xa0 }, val); Assert.AreEqual(2748, LittleBitWriter.GetUInt64(val, 12)); Assert.AreEqual(-1348, LittleBitWriter.GetInt64(val, 12)); ulong bits = 0; bits = BitWriter <BigEndian> .GetBits(0xABC, 12); Assert.AreEqual(0xABC, bits); Assert.AreEqual(2748, BigBitWriter.GetUInt64(bits, 12)); Assert.AreEqual(-1348, BigBitWriter.GetInt64(bits, 12)); bits = BitWriter <LittleEndian> .GetBits(0xABC, 12); Assert.AreEqual(0xBCA, bits); Assert.AreEqual(2748, LittleBitWriter.GetUInt64(bits, 12)); Assert.AreEqual(-1348, LittleBitWriter.GetInt64(bits, 12)); }