From b9b0ab5edb47c9ce6d843915565ede6e76975936 Mon Sep 17 00:00:00 2001 From: Andrey Gumirov Date: Thu, 11 Jan 2024 13:48:10 +0700 Subject: [PATCH] WIP --- MashZip.cpp | 3 +- bitstream.cpp | 7 +--- huffman_table.cpp | 2 +- main.cpp | 102 +++++++++++++++++++++++----------------------- 4 files changed, 54 insertions(+), 60 deletions(-) diff --git a/MashZip.cpp b/MashZip.cpp index 6b394be..b2ea88e 100644 --- a/MashZip.cpp +++ b/MashZip.cpp @@ -20,6 +20,7 @@ void MashZip::unmashzip_stream(std::basic_istream &is, std::basic_ostream< // load huffman table HuffmanTable ht(header); + ibitstream ibs(is); char sym = '\0'; @@ -40,13 +41,11 @@ void MashZip::unmashzip_stream(std::basic_istream &is, std::basic_ostream< void MashZip::mashzip_file(std::basic_istream &cs, std::basic_istream &is, std::basic_ostream &os) { // std::ifstream ifs(name, std::ios::binary); - // is.seekg(0); os.write(MAGIC, 4); // build huffman table by file HuffmanTable ht(cs); - // is.seekg(0); // reset position as ht reads whole file os.write(ht.to_header(), HEADER_SIZE); diff --git a/bitstream.cpp b/bitstream.cpp index 53aa835..aae3859 100644 --- a/bitstream.cpp +++ b/bitstream.cpp @@ -6,11 +6,6 @@ // i.e when stream is 0b12345678 0bABCDEFGH and command is // to read 12 bits: -// out = 00000000 00000000 0000EFGH 12345678 -- wrong -// to read 2 bits: -// out = 00000000 00000000 00000000 00000078 -// TODO: -// to read 12 bits: // out = 00000000 00000000 00008765 4321HGFE // to read 2 bits: // out = 00000000 00000000 00000000 00000087 @@ -55,7 +50,7 @@ int ibitstream::getbits(size_t n) { // " inv " << std::bitset<8>(inv) << " out " << std::bitset<32>(out) << std::endl; this->count += to_read; - read += to_read; + // read += to_read; n -= to_read; if (this->count == 8){ diff --git a/huffman_table.cpp b/huffman_table.cpp index 30ea03d..fe2970b 100644 --- a/huffman_table.cpp +++ b/huffman_table.cpp @@ -200,7 +200,7 @@ int HuffmanTable::decode_one_symbol(ibitstream &bs) char *HuffmanTable::to_header() { char *header = new char[HEADER_SIZE]; - for (size_t i = 0; i < HEADER_SIZE; i++) + for (size_t i = 0; i < HEADER_SIZE; i++) // iterate over header bytes { if (huffmanCodes.find(2 * i) != huffmanCodes.end()) { int len = huffmanCodes[2 * i].first; diff --git a/main.cpp b/main.cpp index e346a38..f08fee0 100644 --- a/main.cpp +++ b/main.cpp @@ -194,76 +194,76 @@ using namespace std; //// Huffman coding algorithm int main(int argc, char **argv) { -// // buildHuffmanTree(cin); -// // 10111010 11110101 -// stringstream ss("\xba\xf5"); -// ibitstream ibs(ss); +// buildHuffmanTree(cin); + // 10111010 11110101 + stringstream ss("\xba\xf5"); + ibitstream ibs(ss); -// // 10111010 11110101 -// // ^^ -// int a = ibs.getbits(2); -// cout << bitset<2>(a) << endl; // 01 + // 10111010 11110101 + // ^^ + int a = ibs.getbits(2); + cout << bitset<2>(a) << endl; // 01 -// // 10111010 11110101 -// // ^^^^ -// int b = ibs.getbits(4); -// cout << bitset<4>(b) << endl; // 0111 + // 10111010 11110101 + // ^^^^ + int b = ibs.getbits(4); + cout << bitset<4>(b) << endl; // 0111 -// // 10111010 11110101 -// // ^^ ^^^^^^^ -// b = ibs.getbits(9); -// cout << bitset<9>(b) << endl; // 011010111 + // 10111010 11110101 + // ^^ ^^^^^^^ + b = ibs.getbits(9); + cout << bitset<9>(b) << endl; // 011010111 -// // 10111010 11110101 -// // ^ + overflow -// try { -// b = ibs.getbits(10); -// cout << b << endl; -// } catch (std::runtime_error &e) { -// cout << "Got runtime error: " << e.what() << endl; -// } + // 10111010 11110101 + // ^ + overflow + try { + b = ibs.getbits(10); + cout << b << endl; + } catch (std::runtime_error &e) { + cout << "Got runtime error: " << e.what() << endl; + } -// ostringstream so("bits: "); -// obitstream obs(so); + ostringstream so("bits: "); + obitstream obs(so); -// obs.writebits(0xf, 3); -// cout << "After 3 bits: " << so.str() << endl; -// // cache here: 00000111 + obs.writebits(0xf, 3); + cout << "After 3 bits: " << so.str() << endl; + // cache here: 00000111 -// // de = 11011110 -// obs.writebits(0xde, 7); -// // here: Flush: 11101111 -// cout << "After 7 bits: " << so.str() << endl; -// obs.flush(); -// // here: Flush: 00000001 -// cout << "After flush: " << so.str() << endl; + // de = 11011110 + obs.writebits(0xde, 7); + // here: Flush: 11101111 + cout << "After 7 bits: " << so.str() << endl; + obs.flush(); + // here: Flush: 00000001 + cout << "After flush: " << so.str() << endl; -// obs.writebits(0xbeef, 16); -// cout << "After 0xbeef: " << so.str() << endl; -// obs.flush(); -// // here: Flush: 0xEFBE - reversed! -// cout << "After flush: " << so.str() << endl; + obs.writebits(0xbeef, 16); + cout << "After 0xbeef: " << so.str() << endl; + obs.flush(); + cout << "After flush: " << so.str() << endl; - // string s = ; + // // string s = ; - stringstream ss1("Some long text!!!!\x01\x02\x03\x04\n123123456789 privet, masha!"); - stringstream ss2("Some long text!!!!\x01\x02\x03\x04\n123123456789 privet, masha!"); - stringstream so1; - stringstream so2; + // stringstream ss1("Some long text!!!!\x01\x02\x03\x04\n123123456789 privet, masha!"); + // stringstream ss2("Some long text!!!!\x01\x02\x03\x04\n123123456789 privet, masha!"); + // stringstream so1; + // stringstream so2; - MashZip mz; + // MashZip mz; - mz.mashzip_file(ss1, ss2, so1); + // mz.mashzip_file(ss1, ss2, so1); - std::cout << "After mashzip: " << so1.str(); + // // std::cout << "After mashzip: " << so1.str(); + // std::cout << so1.str(); - mz.unmashzip_stream(so1, so2); + // mz.unmashzip_stream(so1, so2); - std::cout << "After unmashzip: " << so2.str(); + // std::cout << "After unmashzip: " << so2.str(); // HuffmanTable ht(ss1);