// TODO: Figure out how to not do this! private static byte[] ToByteArray(BitwiseStream data) { var length = (data.LengthBits + 7) / 8; var buffer = new byte[length]; var offset = 0; var count = buffer.Length; data.Seek(0, System.IO.SeekOrigin.Begin); int nread; while ((nread = data.Read(buffer, offset, count)) != 0) { offset += nread; count -= nread; } if (count != 0) { System.Diagnostics.Debug.Assert(count == 1); ulong bits; nread = data.ReadBits(out bits, 64); System.Diagnostics.Debug.Assert(nread > 0); System.Diagnostics.Debug.Assert(nread < 8); buffer[offset] = (byte)(bits << (8 - nread)); } return(buffer); }
private dynamic FromBitstream(BitwiseStream bs) { ulong bits; int len = bs.ReadBits(out bits, (int)lengthAsBits); System.Diagnostics.Debug.Assert(len == lengthAsBits); if (Signed) { return(_endian.GetInt64(bits, (int)lengthAsBits)); } else { return(_endian.GetUInt64(bits, (int)lengthAsBits)); } }
private dynamic SanitizeStream(BitwiseStream bs) { if (bs.LengthBits < lengthAsBits || (bs.LengthBits + 7) / 8 != (lengthAsBits + 7) / 8) { throw new PeachException(string.Format("Error, {0} value has an incorrect length for a {1}-bit {2} number, expected {3} bytes.", debugName, lengthAsBits, Signed ? "signed" : "unsigned", (lengthAsBits + 7) / 8)); } ulong extra; bs.ReadBits(out extra, (int)(bs.LengthBits - lengthAsBits)); if (extra != 0) { throw new PeachException(string.Format("Error, {0} value has an invalid bytes for a {1}-bit {2} number.", debugName, lengthAsBits, Signed ? "signed" : "unsigned")); } return(FromBitstream(bs)); }
public static byte[] ToArray(this BitwiseStream bs) { long pos = bs.PositionBits; bs.SeekBits(0, SeekOrigin.Begin); int len = 0; int count = (int)((bs.LengthBits + 7) / 8); int offset = 0; byte[] buffer = new byte[count]; do { len = bs.Read(buffer, offset, count); offset += len; count -= len; }while (len != 0); if (count != 0) { ulong remain; len = bs.ReadBits(out remain, 64); System.Diagnostics.Debug.Assert(count == 1); System.Diagnostics.Debug.Assert(len < 8); System.Diagnostics.Debug.Assert(len > 0); buffer[offset] = (byte)(remain << (8 - len)); ++offset; --count; } bs.SeekBits(pos, SeekOrigin.Begin); return(buffer); }
private static string BitsToString(BitwiseStream bs) { if (bs.LengthBits == 0) { return(""); } byte[] buf = new byte[32]; long pos = bs.PositionBits; bs.SeekBits(0, System.IO.SeekOrigin.Begin); int len = bs.Read(buf, 0, buf.Length); StringBuilder ret = new StringBuilder(); if (len > 0) { ret.AppendFormat("{0:x2}", buf[0]); } int end = Math.Min(len, buf.Length); for (int i = 1; i < end; ++i) { ret.AppendFormat(" {0:x2}", buf[i]); } long lengthBits = bs.LengthBits; if ((len * 8) < lengthBits) { if (len < buf.Length) { ulong tmp; int bits = bs.ReadBits(out tmp, 64); System.Diagnostics.Debug.Assert(bits < 8); tmp <<= (8 - bits); if (len != 0) { ret.Append(" "); } ret.AppendFormat("{0:x2}", tmp); ret.AppendFormat(" (Len: {0} bits)", lengthBits); } else if ((lengthBits % 8) == 0) { ret.AppendFormat(".. (Len: {0} bytes)", lengthBits / 8); } else { ret.AppendFormat(".. (Len: {0} bits)", lengthBits); } } bs.SeekBits(pos, System.IO.SeekOrigin.Begin); return(ret.ToString()); }