retdec
byte_value_storage.h
Go to the documentation of this file.
1 
6 #ifndef RETDEC_UTILS_BYTE_VALUE_STORAGE_H
7 #define RETDEC_UTILS_BYTE_VALUE_STORAGE_H
8 
9 #include <cstdint>
10 #include <functional>
11 #include <string>
12 #include <vector>
13 
14 namespace retdec {
15 namespace utils {
16 
20 enum class Endianness
21 {
22  UNKNOWN,
23  LITTLE,
24  BIG
25 };
26 
28 {
29 public:
30  ByteValueStorage() = default;
31  virtual ~ByteValueStorage() = default;
32 
33  virtual Endianness getEndianness() const = 0;
34  virtual std::size_t getNibbleLength() const = 0;
35  virtual std::size_t getByteLength() const = 0;
36  virtual std::size_t getWordLength() const = 0;
37  virtual std::size_t getBytesPerWord() const = 0;
38  virtual std::size_t getNumberOfNibblesInByte() const = 0;
39  virtual bool hasMixedEndianForDouble() const = 0;
40 
41  virtual bool getXByte(
42  std::uint64_t address,
43  std::uint64_t x,
44  std::uint64_t& res,
45  Endianness e = Endianness::UNKNOWN) const = 0;
46  virtual bool getXBytes(
47  std::uint64_t address,
48  std::uint64_t x,
49  std::vector<std::uint8_t>& res) const = 0;
50 
51  virtual bool setXByte(
52  std::uint64_t address,
53  std::uint64_t x,
54  std::uint64_t val,
56  virtual bool setXBytes(
57  std::uint64_t address,
58  const std::vector<std::uint8_t>& val) = 0;
59 
61  bool isLittleEndian() const;
62  bool isBigEndian() const;
63  bool isUnknownEndian() const;
64 
65  bool hexToBig(std::string& str) const;
66  bool hexToLittle(std::string& str) const;
67  bool bitsToBig(std::string& str) const;
68  bool bitsToLittle(std::string& str) const;
69  bool bitsToBig(std::vector<unsigned char>& values) const;
70  bool bitsToLittle(std::vector<unsigned char>& values) const;
71 
72  bool get1Byte(
73  std::uint64_t address,
74  std::uint64_t& res,
76  bool get2Byte(
77  std::uint64_t address,
78  std::uint64_t& res,
80  bool get4Byte(
81  std::uint64_t address,
82  std::uint64_t& res,
84  bool get8Byte(
85  std::uint64_t address,
86  std::uint64_t& res,
88  bool get10Byte(
89  std::uint64_t address,
90  long double& res) const;
91  bool getWord(
92  std::uint64_t address,
93  std::uint64_t& res,
95  bool getFloat(
96  std::uint64_t address,
97  float& res) const;
98  bool getDouble(
99  std::uint64_t address,
100  double& res) const;
101 
102  bool set1Byte(
103  std::uint64_t address,
104  std::uint64_t val,
106  bool set2Byte(
107  std::uint64_t address,
108  std::uint64_t val,
110  bool set4Byte(
111  std::uint64_t address,
112  std::uint64_t val,
114  bool set8Byte(
115  std::uint64_t address,
116  std::uint64_t val,
118  bool set10Byte(
119  std::uint64_t address,
120  long double val);
121  bool setWord(
122  std::uint64_t address,
123  std::uint64_t val,
125  bool setFloat(
126  std::uint64_t address,
127  float val);
128  bool setDouble(
129  std::uint64_t address,
130  double val);
131 
132  bool getXByteArray(
133  std::uint64_t address,
134  std::uint64_t x,
135  std::vector<std::uint64_t>& res,
136  std::size_t size,
137  Endianness e = Endianness::UNKNOWN) const;
138  bool get1ByteArray(
139  std::uint64_t address,
140  std::vector<std::uint64_t>& res,
141  std::size_t size,
142  Endianness e = Endianness::UNKNOWN) const;
143  bool get2ByteArray(
144  std::uint64_t address,
145  std::vector<std::uint64_t>& res,
146  std::size_t size,
147  Endianness e = Endianness::UNKNOWN) const;
148  bool get4ByteArray(
149  std::uint64_t address,
150  std::vector<std::uint64_t>& res,
151  std::size_t size,
152  Endianness e = Endianness::UNKNOWN) const;
153  bool get8ByteArray(
154  std::uint64_t address,
155  std::vector<std::uint64_t>& res,
156  std::size_t size,
157  Endianness e = Endianness::UNKNOWN) const;
158  bool get10ByteArray(
159  std::uint64_t address,
160  std::vector<long double>& res,
161  std::size_t size) const;
162  bool getWordArray(
163  std::uint64_t address,
164  std::vector<std::uint64_t>& res,
165  std::size_t,
166  Endianness e = Endianness::UNKNOWN) const;
167  bool getFloatArray(
168  std::uint64_t address,
169  std::vector<float>& res, std::size_t size) const;
170  bool getDoubleArray(
171  std::uint64_t address,
172  std::vector<double>& res, std::size_t size) const;
173 
174  bool getNTBS(
175  std::uint64_t address,
176  std::string& res,
177  std::size_t size = 0) const;
178  bool getNTWS(
179  std::uint64_t address,
180  std::size_t width,
181  std::vector<std::uint64_t>& res) const;
182  bool getNTWSNice(
183  std::uint64_t address,
184  std::size_t width,
185  std::vector<std::uint64_t>& res) const;
186 
187 protected:
189  const std::vector<std::uint8_t>& data,
190  std::uint64_t& value,
191  Endianness endian,
192  std::uint64_t offset = 0,
193  std::uint64_t size = 0) const;
195  std::uint64_t data,
196  std::uint64_t x,
197  std::vector<std::uint8_t>& value,
198  Endianness endian) const;
199 
200  bool get10ByteImpl(
201  const std::vector<std::uint8_t>& data,
202  long double& res) const;
203  bool getFloatImpl(
204  const std::vector<std::uint8_t>& data,
205  float& res) const;
206  bool getDoubleImpl(
207  const std::vector<std::uint8_t>& data,
208  double& res) const;
209 
210  using GetNByteFn = std::function<bool(
211  std::uint64_t,
212  std::uint64_t&,
213  Endianness)>;
214  using GetXByteFn = std::function<bool(
215  std::uint64_t,
216  std::uint64_t,
217  std::uint64_t&, Endianness)>;
218 
219  bool getNTBSImpl(
220  const GetNByteFn& get1ByteFn,
221  std::uint64_t address,
222  std::string& res,
223  std::size_t size) const;
224  bool getNTWSImpl(
225  const GetXByteFn& getXByteFn,
226  std::uint64_t address,
227  std::size_t width,
228  std::vector<std::uint64_t>& res) const;
229  bool getNTWSNiceImpl(
230  const GetXByteFn& getXByteFn,
231  std::uint64_t address,
232  std::size_t width,
233  std::vector<std::uint64_t>& res) const;
234 };
235 
236 } // namespace utils
237 } // namespace retdec
238 
239 #endif
Definition: byte_value_storage.h:28
bool set10Byte(std::uint64_t address, long double val)
Definition: byte_value_storage.cpp:529
virtual std::size_t getBytesPerWord() const =0
bool get4Byte(std::uint64_t address, std::uint64_t &res, Endianness e=Endianness::UNKNOWN) const
Definition: byte_value_storage.cpp:321
bool setFloat(std::uint64_t address, float val)
Definition: byte_value_storage.cpp:567
bool bitsToBig(std::string &str) const
Definition: byte_value_storage.cpp:214
virtual std::size_t getNumberOfNibblesInByte() const =0
virtual std::size_t getByteLength() const =0
bool createValueFromBytes(const std::vector< std::uint8_t > &data, std::uint64_t &value, Endianness endian, std::uint64_t offset=0, std::uint64_t size=0) const
Definition: byte_value_storage.cpp:926
virtual Endianness getEndianness() const =0
bool get1ByteArray(std::uint64_t address, std::vector< std::uint64_t > &res, std::size_t size, Endianness e=Endianness::UNKNOWN) const
Definition: byte_value_storage.cpp:726
bool setDouble(std::uint64_t address, double val)
Definition: byte_value_storage.cpp:582
bool get8Byte(std::uint64_t address, std::uint64_t &res, Endianness e=Endianness::UNKNOWN) const
Definition: byte_value_storage.cpp:339
bool get2Byte(std::uint64_t address, std::uint64_t &res, Endianness e=Endianness::UNKNOWN) const
Definition: byte_value_storage.cpp:303
virtual std::size_t getWordLength() const =0
bool getFloatArray(std::uint64_t address, std::vector< float > &res, std::size_t size) const
Definition: byte_value_storage.cpp:857
Endianness getInverseEndianness() const
Definition: byte_value_storage.cpp:115
virtual bool hasMixedEndianForDouble() const =0
bool bitsToLittle(std::string &str) const
Definition: byte_value_storage.cpp:231
bool getNTBS(std::uint64_t address, std::string &res, std::size_t size=0) const
Definition: byte_value_storage.cpp:608
bool getFloat(std::uint64_t address, float &res) const
Definition: byte_value_storage.cpp:399
bool getNTWS(std::uint64_t address, std::size_t width, std::vector< std::uint64_t > &res) const
Definition: byte_value_storage.cpp:636
bool set1Byte(std::uint64_t address, std::uint64_t val, Endianness e=Endianness::UNKNOWN)
Definition: byte_value_storage.cpp:457
bool getNTWSNice(std::uint64_t address, std::size_t width, std::vector< std::uint64_t > &res) const
Definition: byte_value_storage.cpp:664
bool get10ByteArray(std::uint64_t address, std::vector< long double > &res, std::size_t size) const
Definition: byte_value_storage.cpp:805
std::function< bool(std::uint64_t, std::uint64_t &, Endianness)> GetNByteFn
Definition: byte_value_storage.h:213
bool get2ByteArray(std::uint64_t address, std::vector< std::uint64_t > &res, std::size_t size, Endianness e=Endianness::UNKNOWN) const
Definition: byte_value_storage.cpp:746
bool isUnknownEndian() const
Definition: byte_value_storage.cpp:156
bool isLittleEndian() const
Definition: byte_value_storage.cpp:136
bool set4Byte(std::uint64_t address, std::uint64_t val, Endianness e=Endianness::UNKNOWN)
Definition: byte_value_storage.cpp:493
virtual bool setXByte(std::uint64_t address, std::uint64_t x, std::uint64_t val, Endianness e=Endianness::UNKNOWN)=0
bool set8Byte(std::uint64_t address, std::uint64_t val, Endianness e=Endianness::UNKNOWN)
Definition: byte_value_storage.cpp:511
bool getDoubleImpl(const std::vector< std::uint8_t > &data, double &res) const
Definition: byte_value_storage.cpp:1041
bool getNTWSNiceImpl(const GetXByteFn &getXByteFn, std::uint64_t address, std::size_t width, std::vector< std::uint64_t > &res) const
Definition: byte_value_storage.cpp:1109
virtual bool getXBytes(std::uint64_t address, std::uint64_t x, std::vector< std::uint8_t > &res) const =0
bool isBigEndian() const
Definition: byte_value_storage.cpp:146
std::function< bool(std::uint64_t, std::uint64_t, std::uint64_t &, Endianness)> GetXByteFn
Definition: byte_value_storage.h:217
bool getWord(std::uint64_t address, std::uint64_t &res, Endianness e=Endianness::UNKNOWN) const
Definition: byte_value_storage.cpp:383
bool getWordArray(std::uint64_t address, std::vector< std::uint64_t > &res, std::size_t, Endianness e=Endianness::UNKNOWN) const
Definition: byte_value_storage.cpp:839
virtual std::size_t getNibbleLength() const =0
bool set2Byte(std::uint64_t address, std::uint64_t val, Endianness e=Endianness::UNKNOWN)
Definition: byte_value_storage.cpp:475
bool getNTBSImpl(const GetNByteFn &get1ByteFn, std::uint64_t address, std::string &res, std::size_t size) const
Definition: byte_value_storage.cpp:1054
bool getDoubleArray(std::uint64_t address, std::vector< double > &res, std::size_t size) const
Definition: byte_value_storage.cpp:889
bool setWord(std::uint64_t address, std::uint64_t val, Endianness e=Endianness::UNKNOWN)
Definition: byte_value_storage.cpp:551
bool get4ByteArray(std::uint64_t address, std::vector< std::uint64_t > &res, std::size_t size, Endianness e=Endianness::UNKNOWN) const
Definition: byte_value_storage.cpp:766
bool getNTWSImpl(const GetXByteFn &getXByteFn, std::uint64_t address, std::size_t width, std::vector< std::uint64_t > &res) const
Definition: byte_value_storage.cpp:1076
bool get10ByteImpl(const std::vector< std::uint8_t > &data, long double &res) const
Definition: byte_value_storage.cpp:1010
bool hexToBig(std::string &str) const
Definition: byte_value_storage.cpp:168
virtual bool setXBytes(std::uint64_t address, const std::vector< std::uint8_t > &val)=0
virtual bool getXByte(std::uint64_t address, std::uint64_t x, std::uint64_t &res, Endianness e=Endianness::UNKNOWN) const =0
bool get1Byte(std::uint64_t address, std::uint64_t &res, Endianness e=Endianness::UNKNOWN) const
Definition: byte_value_storage.cpp:285
bool getFloatImpl(const std::vector< std::uint8_t > &data, float &res) const
Definition: byte_value_storage.cpp:1028
bool getXByteArray(std::uint64_t address, std::uint64_t x, std::vector< std::uint64_t > &res, std::size_t size, Endianness e=Endianness::UNKNOWN) const
Definition: byte_value_storage.cpp:690
bool get10Byte(std::uint64_t address, long double &res) const
Definition: byte_value_storage.cpp:357
bool hexToLittle(std::string &str) const
Definition: byte_value_storage.cpp:191
bool createBytesFromValue(std::uint64_t data, std::uint64_t x, std::vector< std::uint8_t > &value, Endianness endian) const
Definition: byte_value_storage.cpp:977
bool get8ByteArray(std::uint64_t address, std::vector< std::uint64_t > &res, std::size_t size, Endianness e=Endianness::UNKNOWN) const
Definition: byte_value_storage.cpp:786
virtual ~ByteValueStorage()=default
bool getDouble(std::uint64_t address, double &res) const
Definition: byte_value_storage.cpp:419
Endianness
Definition: byte_value_storage.h:21
Definition: archive_wrapper.h:19