retdec
bit_parsers.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_UNPACKER_DECOMPRESSION_NRV_BIT_PARSERS_H
8 #define RETDEC_UNPACKER_DECOMPRESSION_NRV_BIT_PARSERS_H
9 
12 
13 using namespace retdec::utils;
14 
15 namespace retdec {
16 namespace unpacker {
17 
18 class BitParser
19 {
20 public:
21  BitParser() {}
22  BitParser(const BitParser&) = delete;
23  virtual ~BitParser() = default;
24 
25  virtual bool getBit(uint8_t& bit, const DynamicBuffer& data, uint32_t& pos) = 0;
26 
27 private:
28  BitParser& operator =(const BitParser&);
29 };
30 
31 template <typename T> class BitParserN : public BitParser
32 {
33 public:
34  BitParserN() : _value()
35  {
36  static_assert(std::is_integral<T>::value, "BitParser requires integral type");
37  }
38 
39  BitParserN(const BitParser&) = delete;
40 
41 protected:
42  T _value;
43 
44 private:
45  BitParserN& operator =(const BitParserN&);
46 };
47 
48 class BitParser8 : public BitParserN<uint32_t>
49 {
50 public:
51  BitParser8() = default;
52  BitParser8(const BitParser8&) = delete;
53 
54  virtual bool getBit(uint8_t& bit, const DynamicBuffer& data, uint32_t& pos) override
55  {
56  bit = (_value >> 7) & 1;
57  _value <<= 1;
58  if ((_value & 0xFF) == 0)
59  {
60  if (pos >= data.getRealDataSize())
61  return false;
62 
63  _value = data.read<uint8_t>(pos++, retdec::utils::Endianness::LITTLE);
64 
65  bit = (_value >> 7) & 1;
66  _value <<= 1;
67  _value += 1;
68  }
69 
70  return true;
71  }
72 };
73 
74 class BitParserLe32 : public BitParserN<uint32_t>
75 {
76 public:
77  BitParserLe32() = default;
78  BitParserLe32(const BitParserLe32&) = delete;
79 
80  virtual bool getBit(uint8_t& bit, const DynamicBuffer& data, uint32_t& pos) override
81  {
82  bit = (_value >> 31) & 1;
83  _value <<= 1;
84  if (_value == 0)
85  {
86  if (pos >= data.getRealDataSize())
87  return false;
88 
89  _value = data.read<uint32_t>(pos, retdec::utils::Endianness::LITTLE);
90  pos += 4;
91 
92  bit = (_value >> 31) & 1;
93  _value <<= 1;
94  _value += 1;
95  }
96 
97  return true;
98  }
99 };
100 
101 } // namespace unpacker
102 } // namespace retdec
103 
104 #endif
Definition: bit_parsers.h:49
virtual bool getBit(uint8_t &bit, const DynamicBuffer &data, uint32_t &pos) override
Definition: bit_parsers.h:54
BitParser8(const BitParser8 &)=delete
Definition: bit_parsers.h:75
BitParserLe32(const BitParserLe32 &)=delete
virtual bool getBit(uint8_t &bit, const DynamicBuffer &data, uint32_t &pos) override
Definition: bit_parsers.h:80
Definition: bit_parsers.h:32
BitParserN()
Definition: bit_parsers.h:34
T _value
Definition: bit_parsers.h:42
BitParserN(const BitParser &)=delete
Definition: bit_parsers.h:19
virtual bool getBit(uint8_t &bit, const DynamicBuffer &data, uint32_t &pos)=0
BitParser(const BitParser &)=delete
BitParser()
Definition: bit_parsers.h:21
virtual ~BitParser()=default
The class for dynamic buffered data manipulation taking the endianness of the data in account.
Definition: dynamic_buffer.h:36
uint32_t getRealDataSize() const
Definition: dynamic_buffer.cpp:156
T read(uint32_t pos, retdec::utils::Endianness endianness=retdec::utils::Endianness::UNKNOWN) const
Definition: dynamic_buffer.h:92
Declaration of class for buffered data mainpulation.
Header file for fileformat types and structures.
Definition: unpacking_stub.h:16
Definition: archive_wrapper.h:19
Supportive functionality for the generic unpacker.