Changed file writing method to dynamic bit-packing
This commit is contained in:
		
							parent
							
								
									d901cd60f2
								
							
						
					
					
						commit
						6d779d8606
					
				@ -40,7 +40,7 @@ vuchar pack_n(const vuint16::const_iterator t_input_begin,
 | 
			
		||||
  vuchar ret{};
 | 
			
		||||
 | 
			
		||||
  // max value with current number of bits + 1
 | 
			
		||||
  const int max_value = ipow(2, t_n);
 | 
			
		||||
  const int max_value = ipow(2, t_n) - 1;
 | 
			
		||||
 | 
			
		||||
  uchar current_char = 0;
 | 
			
		||||
  int step = t_n / 8;
 | 
			
		||||
 | 
			
		||||
@ -19,4 +19,7 @@ std::vector<unsigned char>
 | 
			
		||||
pack_16(const std::vector<std::uint16_t>::const_iterator,
 | 
			
		||||
        const std::vector<std::uint16_t>::const_iterator);
 | 
			
		||||
 | 
			
		||||
/// \brief Bat-packs the input dynamically
 | 
			
		||||
std::vector<unsigned char> pack(const std::vector<std::uint16_t>);
 | 
			
		||||
 | 
			
		||||
#endif /* LZW_SRC_BITPACK_H_ */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								src/io.cc
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								src/io.cc
									
									
									
									
									
								
							@ -4,7 +4,9 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "io.hh"
 | 
			
		||||
#include "bitpack.hh"
 | 
			
		||||
#include <array>
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
 | 
			
		||||
#ifdef Debug
 | 
			
		||||
constexpr bool debug_mode = true;
 | 
			
		||||
@ -71,21 +73,9 @@ void write_file(FILE *const t_out, const vvuint16 &t_text) {
 | 
			
		||||
 *  \param t_chunk Chunk to be written to \p t_out
 | 
			
		||||
 */
 | 
			
		||||
void write_chunk(FILE *const t_out, const vuint16 &t_chunk) {
 | 
			
		||||
  const auto chunk_size = static_cast<uint16_t>(t_chunk.size());
 | 
			
		||||
  const auto output = pack(t_chunk);
 | 
			
		||||
  const auto chunk_size = static_cast<uint16_t>(output.size());
 | 
			
		||||
  fwrite(&chunk_size, sizeof(chunk_size), 1, t_out);
 | 
			
		||||
  std::array<unsigned char, 3> data = {0, 0, 0};
 | 
			
		||||
  for (size_t i = 0; i < t_chunk.size(); ++i) {
 | 
			
		||||
    if (i % 2 == 0) {
 | 
			
		||||
      data[0] = static_cast<unsigned char>(t_chunk[i] >> 4);
 | 
			
		||||
      data[1] = static_cast<unsigned char>(t_chunk[i] << 4);
 | 
			
		||||
    } else {
 | 
			
		||||
      data[1] |= static_cast<unsigned char>(t_chunk[i] >> 8) & 0xC;
 | 
			
		||||
      data[2] = static_cast<unsigned char>(t_chunk[i]);
 | 
			
		||||
      fwrite(data.data(), sizeof(data[0]), 3, t_out);
 | 
			
		||||
      data.fill(0);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (t_chunk.size() % 2 != 0) {
 | 
			
		||||
    fwrite(data.data(), sizeof(data[0]), 3, t_out);
 | 
			
		||||
  }
 | 
			
		||||
  fwrite((const char *)(output.data()), sizeof(output[0]), output.size(),
 | 
			
		||||
         t_out);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user