Beispiel #1
0
        public CompressedChunk(XlBinaryReader Data)
        {
            this.CompressedChunkStart = Data.i;

            this.CompressedHeader = new CompressedChunkHeader(Data);
            this.CompressedData   = new CompressedChunkData(this.CompressedHeader, Data);
        }
Beispiel #2
0
        //protected TokenSequence _TokenSequence;

        public CompressedChunkData(CompressedChunkHeader header, XlBinaryReader Data)
        {
            this.header = header;

            if (header.CompressedChunkFlag == (Byte)0x00)
            {
                // page 57: CompressedChunkData contains an array of CompressedChunkHeader.CompressedChunkSize
                // elements plus 3 bytes of uncompressed data
                int ArraySize = header.CompressedChunkSize + 3;
                this.Data = new Byte[ArraySize];
                int CopySize = header.CompressedChunkSize; // todo: this is my fix...
                Array.Copy(Data.ReadBytes(CopySize), 0, this.Data, 0, CopySize);

                //Array.Copy(Data, ArrayIndex, this.Data, 0, CopySize);
                //ArrayIndex += header.CompressedChunkSize;

                this.Decompress = (buffer, state) => DecompressRawChunk(buffer, state, this.Data);
            }
            else if (header.CompressedChunkFlag == (Byte)0x01)
            {
                // TODO: DO something like when compressedcurrent < compressedend -> add a new tokensequence

                // page 57: CompressedChunkData contains an array of TokenSequence elements

                var size           = Math.Min(header.CompressedChunkSize, Data.Length - Data.i);
                var tokenSequences = new List <TokenSequence>();

                int processedBytes = 0;
                while (processedBytes < size)
                {
                    int remainingBytes = size - processedBytes;
                    var tokenSequence  = new TokenSequence(Data, remainingBytes);
                    tokenSequences.Add(tokenSequence);
                    processedBytes += tokenSequence.GetSizeInBytes();
                }


                //var tokenSequenceBytes = tokenSequence.GetDataInRawBytes();
                //this.Data = tokenSequenceBytes;
                //var tokenSequenceSize = tokenSequenceBytes.Count();

                //if(tokenSequenceSize != header.CompressedChunkSize+3)
                //{
                //throw new InvalidOperationException(String.Format("CompressedChunkData Data-array size expected {0}, but was {1}", header.CompressedChunkSize+3, tokenSequenceSize));
                //}

                this.Decompress = (buffer, state) => DecompressTokenSequence(buffer, state, tokenSequences);
            }
            else
            {
                throw new Exception();
            }

            //this._TokenSequence = new TokenSequence(ref Data);
            //Data = Data.Skip(N);
        }