32 #ifndef LEDGER_CORE_ZARITH_H 33 #define LEDGER_CORE_ZARITH_H 37 #include <bytes/BytesReader.h> 38 #include <utils/hex.h> 55 static std::vector<uint8_t> zSerializeNumber(
const std::vector<uint8_t> &inputData) {
56 std::vector<uint8_t> result;
57 size_t id = inputData.size() - 1;
59 bool needAdditionalByte =
false;
60 while (
id >= 0 &&
id < inputData.size()) {
61 auto byte = inputData[id];
67 byte |=
id < inputData.size() - 1 ? inputData[
id + 1] >> (7 - (offset - 1)) : 0x00;
71 bool isFirst =
id == 0;
72 needAdditionalByte = isFirst && inputData[id] >> (7 - offset);
78 result.push_back(byte);
81 offset = (offset + 1) % 8;
89 if (needAdditionalByte) {
93 offset = (offset - 1) % 8;
94 result.push_back(inputData[
id] >> (7 - offset));
96 result[result.size() - 1] &= 0x7F;
103 static std::vector<uint8_t> zParse(
const std::vector<uint8_t> &inputData) {
106 return zParse(bytesReader);
111 static std::vector<uint8_t> zParse(
BytesReader &reader) {
115 std::vector<uint8_t> data(reader.readUntilEnd());
119 std::vector<uint8_t> result;
120 size_t id = 0, delay = 0;
122 while (
id + delay < data.size()) {
123 auto byte = data[
id + delay];
124 auto isLast =
id + delay == data.size() - 1;
127 auto shouldStop = !(byte & 0x80);
131 byte &= data[
id + delay] & 0x7F;
137 byte |= !isLast && !shouldStop ? data[
id + delay + 1] << (7 - offset) : 0x00;
139 if (!(isLast && byte == 0)) {
140 result.push_back(byte);
155 auto min = std::min<unsigned long>(
id + delay, data.size());
159 std::reverse(result.begin(), result.end());
166 #endif //LEDGER_CORE_ZARITH_H std::vector< uint8_t > read(unsigned long length)
Definition: BytesReader.cpp:71
unsigned long getCursor() const
Definition: BytesReader.cpp:80
Definition: BytesReader.h:47
void reset()
Definition: BytesReader.cpp:76
Definition: Account.cpp:8