C++ Utilities: io/binaryreader.cpp Source File

C++ Utilities 5.34.1 Useful C++ classes and routines such as argument parser, IO and conversion utilities

Loading...
Searching...
No Matches
binaryreader.cpp
Go to the documentation of this file.
1#include "./binaryreader.h"
2
3#include "../conversion/conversionexception.h"
4
5#include <cstring>
6#include <sstream>
7
8using namespace std;
9
10namespace CppUtilities {
11
18
30 void BinaryReader::setStream(istream *stream, bool giveOwnership)
31{
32 if (m_ownership) {
33 delete m_stream;
34 }
35 if (stream) {
36 m_stream = stream;
37 m_ownership = giveOwnership;
38 } else {
39 m_stream = nullptr;
40 m_ownership = false;
41 }
42}
43
50istream::pos_type BinaryReader::readStreamsize()
51{
52 istream::pos_type cp = m_stream->tellg();
53 m_stream->seekg(0, ios_base::end);
54 const auto streamsize = m_stream->tellg();
55 m_stream->seekg(cp);
56 return streamsize;
57}
58
65istream::pos_type BinaryReader::readRemainingBytes()
66{
67 istream::pos_type cp = m_stream->tellg();
68 m_stream->seekg(0, ios_base::end);
69 const auto streamsize = m_stream->tellg();
70 m_stream->seekg(cp);
71 return streamsize - cp;
72}
73
74void BinaryReader::bufferVariableLengthInteger()
75{
76 static constexpr int maxPrefixLength = 8;
77 int prefixLength = 1;
78 const auto beg = static_cast<std::uint8_t>(m_stream->peek());
79 std::uint8_t mask = 0x80;
80 while (prefixLength <= maxPrefixLength && (beg & mask) == 0) {
81 ++prefixLength;
82 mask >>= 1;
83 }
84 if (prefixLength > maxPrefixLength) {
85 throw ConversionException("Length denotation of variable length unsigned integer exceeds maximum.");
86 }
87 memset(m_buffer, 0, maxPrefixLength);
88 m_stream->read(m_buffer + (maxPrefixLength - prefixLength), prefixLength);
89 *(m_buffer + (maxPrefixLength - prefixLength)) ^= static_cast<char>(mask);
90}
91
95 string BinaryReader::readString(size_t length)
96{
97 string res;
98 res.resize(length);
99 m_stream->read(&res[0], static_cast<streamsize>(length));
100 return res;
101}
102
110std::string BinaryReader::readTerminatedString(std::uint8_t termination)
111{
112 stringstream ss(ios_base::in | ios_base::out | ios_base::binary);
113 ss.exceptions(ios_base::badbit | ios_base::failbit);
114 m_stream->get(*ss.rdbuf(), static_cast<char>(termination)); // delim byte is not extracted from the stream
115 m_stream->seekg(1, ios_base::cur); // "extract" delim byte manually
116 return ss.str();
117}
118
128 string BinaryReader::readTerminatedString(std::size_t maxBytesToRead, std::uint8_t termination)
129{
130 string res;
131 res.reserve(maxBytesToRead);
132 while (res.size() < maxBytesToRead) {
133 const auto c = static_cast<char>(m_stream->get());
134 if (static_cast<std::uint8_t>(c) == termination) {
135 return res;
136 }
137 res += c;
138 }
139 return res;
140}
141
150std::uint32_t BinaryReader::readCrc32(size_t length)
151{
152 std::uint32_t crc = 0x00;
153 for (std::uint32_t i = 0; i < length; ++i) {
154 crc = (crc << 8) ^ crc32Table[((crc >> 24) & 0xff) ^ static_cast<std::uint8_t>(m_stream->get())];
155 }
156 return crc;
157}
158
167std::uint32_t BinaryReader::computeCrc32(const char *buffer, size_t length)
168{
169 std::uint32_t crc = 0x00;
170 for (const char *i = buffer, *end = buffer + length; i != end; ++i) {
171 crc = (crc << 8) ^ crc32Table[((crc >> 24) & 0xff) ^ static_cast<std::uint8_t>(*i)];
172 }
173 return crc;
174}
175
181const std::uint32_t BinaryReader::crc32Table[] = { 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
182 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
183 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
184 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
185 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
186 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
187 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
188 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
189 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
190 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
191 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
192 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
193 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
194 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
195 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
196 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
197 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
198 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
199 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
200 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
201 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
202 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 };
203
204} // namespace CppUtilities
binaryreader.h
CppUtilities::BinaryReader::computeCrc32
static std::uint32_t computeCrc32(const char *buffer, std::size_t length)
Reads length bytes from the buffer and computes the CRC-32 for that block of data.
Definition binaryreader.cpp:167
CppUtilities::BinaryReader::readTerminatedString
std::string readTerminatedString(std::uint8_t termination=0)
Reads a terminated string from the current stream.
Definition binaryreader.cpp:110
CppUtilities::BinaryReader::readString
std::string readString(std::size_t length)
Reads a string from the current stream of the given length from the stream and advances the current p...
Definition binaryreader.cpp:95
CppUtilities::BinaryReader::crc32Table
static const std::uint32_t crc32Table[]
CRC-32 table.
Definition binaryreader.h:78
CppUtilities::BinaryReader::setStream
void setStream(std::istream *stream, bool giveOwnership=false)
Assigns the stream the reader will read from when calling one of the read-methods.
Definition binaryreader.cpp:30
CppUtilities::BinaryReader::stream
const std::istream * stream() const
Returns a pointer to the stream the reader will read from when calling one of the read-methods.
Definition binaryreader.h:148
CppUtilities::BinaryReader::readRemainingBytes
std::istream::pos_type readRemainingBytes()
Returns the number of remaining bytes in the stream from the current offset.
Definition binaryreader.cpp:65
CppUtilities::BinaryReader::readCrc32
std::uint32_t readCrc32(std::size_t length)
Reads length bytes from the stream and computes the CRC-32 for that block of data.
Definition binaryreader.cpp:150
CppUtilities::BinaryReader::giveOwnership
void giveOwnership()
The reader will take ownership over the assigned stream.
Definition binaryreader.h:172
CppUtilities::BinaryReader::readStreamsize
std::istream::pos_type readStreamsize()
Returns the size of the assigned stream.
Definition binaryreader.cpp:50
conversionexception.h
CppUtilities
Contains all utilities provided by the c++utilities library.
Definition argumentparser.h:18
std
STL namespace.
i
constexpr int i
Definition traitstests.cpp:106