public void Decompress(string inputFile, string outputFile) { FileInfo file = new FileInfo(inputFile); int numberOfBits = 8 * (int)file.Length; using (BitReader bitReader = new BitReader(inputFile)) using (BitWriter bitWriter = new BitWriter(outputFile)) { bool inghetareD = bitReader.readNBits(1) == 1; int indexD = bitReader.readNBits(4); numberOfBits -= 5; string s = ""; int indexMaxSize = Convert.ToInt32(Math.Pow(2, indexD)) - 1; int chIndex; chIndex = bitReader.readNBits(indexD); numberOfBits -= indexD; s = _decompressSymbolList[chIndex]; bitWriter.WriteNBits(Convert.ToInt32(Convert.ToChar(s)), s.Length * 8); string entry = ""; while (numberOfBits >= indexD) { chIndex = bitReader.readNBits(indexD); numberOfBits -= indexD; if (chIndex >= _decompressSymbolList.Count) { entry = s + s[0]; } else { entry = _decompressSymbolList[chIndex]; } Write(entry, bitWriter); if (_decompressSymbolList.Count > indexMaxSize) { if (!inghetareD) { _decompressSymbolList.Clear(); for (int i = 0; i < 256; i++) { _decompressSymbolList.Add(((char)i).ToString()); } } } _decompressSymbolList.Add(s + entry[0]); s = entry; } } }
private void FillBuffer(BitReader bitReader) { for (int i = 0; i < buffer.Length; i++) { buffer[i] = Convert.ToByte(bitReader.readNBits(8)); } }
public static void TestBitReaderAndBitWriter(string inputFile, string outputFile) { FileInfo file = new FileInfo(inputFile); int nbr = 8 * (int)file.Length; Random randomNb = new Random(); using (BitReader bitReader = new BitReader(inputFile)) using (BitWriter bitWriter = new BitWriter(outputFile)) { while (nbr > 0) { int nb = randomNb.Next(31) + 1; if (nb > nbr) { nb = nbr; } int bitSequence = bitReader.readNBits(nb); bitWriter.WriteNBits(bitSequence, nb); nbr -= nb; } bitWriter.WriteNBits(0, 7); } }
private int GetInitialFileSize(BitReader bitReader, int numberOfValues) { int sum = 0; string[] number = new string[4]; for (int i = 0; i < numberOfValues; i++) { number[3] = Convert.ToString(bitReader.readNBits(8), 16); number[2] = Convert.ToString(bitReader.readNBits(8), 16); number[1] = Convert.ToString(bitReader.readNBits(8), 16); number[0] = Convert.ToString(bitReader.readNBits(8), 16); sum += Convert.ToInt32(number[0].PadLeft(2, '0') + number[1].PadLeft(2, '0') + number[2].PadLeft(2, '0') + number[3].PadLeft(2, '0'), 16); } return(sum); }
public void Decompress(string inputFile, string outputFile) { FileInfo file = new FileInfo(inputFile); int numberOfBits = (int)file.Length * 8; bufferD = new byte[file.Length]; using (BitReader bitReader = new BitReader(inputFile)) using (BitWriter bitWriter = new BitWriter(outputFile)) { int searchbufferLength, lookAheadBufferlength; searchbufferLength = bitReader.readNBits(5); lookAheadBufferlength = bitReader.readNBits(3); int position, length, ch, indexD = 0; while (numberOfBits > 0) { position = bitReader.readNBits(8); length = bitReader.readNBits(8); ch = bitReader.readNBits(8); numberOfBits -= 24; if (length == 0) { bitWriter.WriteNBits(ch, 8); bufferD[indexD++] = Convert.ToByte(ch); } else { for (int i = indexD - position - 1; i < length; i++) { bufferD[indexD++] = bufferD[i]; bitWriter.WriteNBits(bufferD[i], 8); } bufferD[indexD++] = Convert.ToByte(ch); bitWriter.WriteNBits(ch, 8); } } } }
public void Compress(string inputFile, string outputFile) { FileInfo file = new FileInfo(inputFile); int numberOfBits = 8 * (int)file.Length; int indexMaxSize = Convert.ToInt32(Math.Pow(2, _index)) - 1; using (BitReader bitReader = new BitReader(inputFile)) using (BitWriter bitWriter = new BitWriter(outputFile)) { bitWriter.WriteBit(_inghetare ? 1 : 0); bitWriter.WriteNBits(_index, 4); string s = ""; char ch; while (numberOfBits > 0) { ch = Convert.ToChar(bitReader.readNBits(8)); numberOfBits -= 8; int firstOccurence = _symbolList.IndexOf(s + ch); if (firstOccurence != -1 && firstOccurence <= indexMaxSize) { s += ch; } else { Encode(s, bitWriter); if (_symbolList.Count > indexMaxSize) { if (!_inghetare) { _symbolList.Clear(); for (int i = 0; i < 256; i++) { _symbolList.Add(((char)i).ToString()); } } } _symbolList.Add(s + ch); s = Convert.ToString(ch); } } Encode(s, bitWriter); bitWriter.WriteNBits(0, 7); } }
private void CreateStatistics(string inputFile) { FileInfo file = new FileInfo(inputFile); int numberOfBits = 8 * (int)file.Length; using (BitReader bitReader = new BitReader(inputFile)) { while (numberOfBits > 0) { int character = bitReader.readNBits(8); _charFrequency[character]++; numberOfBits -= 8; } } }
private void Write(string inputFile, string outputFile) { using (BitWriter bitWriter = new BitWriter(outputFile)) { //header WriteAlocationMap(bitWriter); WriteCharFrequencyOn4Bytes(bitWriter); FileInfo file = new FileInfo(inputFile); int numberOfBits = 8 * (int)file.Length; using (BitReader bitReader = new BitReader(inputFile)) { while (numberOfBits > 0) { int character = bitReader.readNBits(8); bitWriter.WriteNBits(_charCode[character], _codeLength[character]); numberOfBits -= 8; } bitWriter.WriteNBits(0, 7); } } }
public void Compress(string inputFile, string outputFile) { FileInfo file = new FileInfo(inputFile); buffer = new byte[file.Length]; int index = 0; using (BitReader bitReader = new BitReader(inputFile)) using (BitWriter bitWriter = new BitWriter(outputFile)) { FillBuffer(bitReader); int character = buffer[index]; int position = 0; int length = 0; //first token WriteToken(bitWriter, position, length, character); _slidingWindow.Add(character); index++; character = buffer[index]; length = 0; while (index < buffer.Length) { int i = 0; string prevChar = null; while (i < _searchBufferMaxLength) { if (i < _slidingWindow.Count) { break; } int lookAheadIndex = index - i - 1; if (buffer[lookAheadIndex] == character) { //vezi cat de lunga ii secventa de potrivire prevChar = character.ToString(); int j = lookAheadIndex; while (j < _lookAheadBufferMaxLength + i) { if (j > buffer.Length) { break; } character = buffer[lookAheadIndex]; } } else { i++; } } } /*******************************************************************************/ //first token WriteToken(bitWriter, position, length, character); _slidingWindow.Add(character); character = bitReader.readNBits(8); position = 0; if (_slidingWindow[0] == character) { length = 1; _slidingWindow.Add(character); character = bitReader.readNBits(8); } else { length = 0; } //second token WriteToken(bitWriter, position, length, character); _slidingWindow.Add(character); character = bitReader.readNBits(8); if (_slidingWindow[1] == character) { position = 0; _slidingWindow.Add(character); character = bitReader.readNBits(8); if (_slidingWindow[2] == character) { } else { } } else if (_slidingWindow[0] == character) { position = 1; _slidingWindow.Add(character); character = bitReader.readNBits(8); if (_slidingWindow[1] == character) { } else { length = 1; } } //third token WriteToken(bitWriter, position, length, character); } }