Haio 0.2.X
Homebrew Asset IO/CDN
Loading...
Searching...
No Matches
bytes.cpp
Go to the documentation of this file.
1#include <haio_util.hpp>
2
3namespace Haio::Util {
4
5bool hasBytes(Bytes data, size_t off, size_t len) {
6 return off <= data.size() && len <= data.size() - off;
7}
8
9void appendU32LE(std::vector<uint8_t>& out, uint32_t value) {
10 out.push_back(static_cast<uint8_t>(value));
11 out.push_back(static_cast<uint8_t>(value >> 8));
12 out.push_back(static_cast<uint8_t>(value >> 16));
13 out.push_back(static_cast<uint8_t>(value >> 24));
14}
15
16void appendU64LE(std::vector<uint8_t>& out, uint64_t value) {
17 appendU32LE(out, static_cast<uint32_t>(value));
18 appendU32LE(out, static_cast<uint32_t>(value >> 32));
19}
20
21uint32_t readU32LE(Bytes data, size_t off) {
22 if (!hasBytes(data, off, 4)) return 0;
23 return static_cast<uint32_t>(data[off + 0])
24 | (static_cast<uint32_t>(data[off + 1]) << 8)
25 | (static_cast<uint32_t>(data[off + 2]) << 16)
26 | (static_cast<uint32_t>(data[off + 3]) << 24);
27}
28
29uint32_t readU32BE(Bytes data, size_t off) {
30 if (!hasBytes(data, off, 4)) return 0;
31 return (static_cast<uint32_t>(data[off + 0]) << 24)
32 | (static_cast<uint32_t>(data[off + 1]) << 16)
33 | (static_cast<uint32_t>(data[off + 2]) << 8)
34 | static_cast<uint32_t>(data[off + 3]);
35}
36
37uint64_t readU64LE(Bytes data, size_t off) {
38 return static_cast<uint64_t>(readU32LE(data, off))
39 | (static_cast<uint64_t>(readU32LE(data, off + 4)) << 32);
40}
41
42Result<std::vector<uint8_t>> slice(Bytes data, size_t off, size_t len) {
43 if (!hasBytes(data, off, len)) {
44 return std::unexpected(Error{ErrorCode::InvalidInput, "truncated payload"});
45 }
46 return std::vector<uint8_t>{data.begin() + static_cast<std::ptrdiff_t>(off),
47 data.begin() + static_cast<std::ptrdiff_t>(off + len)};
48}
49
50}
uint32_t readU32BE(Bytes data, size_t off)
Definition bytes.cpp:29
Result< std::vector< uint8_t > > slice(Bytes data, size_t off, size_t len)
Definition bytes.cpp:42
uint64_t readU64LE(Bytes data, size_t off)
Definition bytes.cpp:37
bool hasBytes(Bytes data, size_t off, size_t len)
Definition bytes.cpp:5
void appendU64LE(std::vector< uint8_t > &out, uint64_t value)
Definition bytes.cpp:16
uint32_t readU32LE(Bytes data, size_t off)
Definition bytes.cpp:21
void appendU32LE(std::vector< uint8_t > &out, uint32_t value)
Definition bytes.cpp:9
std::expected< T, Error > Result
std::span< const uint8_t > Bytes