Ejemplo n.º 1
0
        /// <summary>
        ///     Decodes and decompresses the container.
        /// </summary>
        /// <param name="buffer"> The buffer. </param>
        /// <returns> The decompressed container. </returns>
        /// <exception cref="IOException"> if an I/O error occurs. </exception>
        public static Container Decode(ByteBuffer buffer)
        {
            /* decode the type and length */
            var type   = buffer.get() & 0xFF;
            var length = buffer.getInt();

            /* check if we should decompress the data or not */
            if (type == COMPRESSION_NONE)
            {
                /* simply grab the data and wrap it in a buffer */
                var temp = new byte[length];
                buffer.get(temp);
                var data = ByteBuffer.wrap(temp);

                /* decode the version if present */
                var version = -1;
                if (buffer.remaining() >= 2)
                {
                    version = buffer.getShort();
                }

                /* and return the decoded container */
                return(new Container(type, data, version));
            }
            else
            {
                /* grab the length of the uncompressed data */
                var uncompressedLength = buffer.getInt();

                /* grab the data */
                var compressed = new byte[length];
                buffer.get(compressed);

                /* uncompress it */
                byte[] uncompressed;
                if (type == COMPRESSION_BZIP2)
                {
                    uncompressed = CompressionUtils.Bunzip2(compressed);
                }
                else if (type == COMPRESSION_GZIP)
                {
                    uncompressed = CompressionUtils.Gunzip(compressed);
                }
                else
                {
                    throw new IOException("Invalid compression type");
                }

                /* check if the lengths are equal */
                if (uncompressed.Length != uncompressedLength)
                {
                    throw new IOException("Length mismatch");
                }

                /* decode the version if present */
                var version = -1;
                if (buffer.remaining() >= 2)
                {
                    version = buffer.getShort();
                }

                /* and return the decoded container */
                return(new Container(type, ByteBuffer.wrap(uncompressed), version));
            }
        }