Ejemplo n.º 1
0
        // 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);
        }
Ejemplo n.º 2
0
        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));
            }
        }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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());
        }