public CompressedChunk(XlBinaryReader Data) { this.CompressedChunkStart = Data.i; this.CompressedHeader = new CompressedChunkHeader(Data); this.CompressedData = new CompressedChunkData(this.CompressedHeader, Data); }
//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); }