mirror of
https://github.com/markqvist/reticulum-cpp
synced 2026-08-12 18:35:00 -04:00
124 lines
2.7 KiB
C++
124 lines
2.7 KiB
C++
#include "Bytes.h"
|
|
|
|
using namespace RNS;
|
|
|
|
void Bytes::ownData() {
|
|
if (!_data) {
|
|
newData();
|
|
}
|
|
else if (!_owner) {
|
|
Data *data;
|
|
if (!_data->empty()) {
|
|
//extreme("Bytes is creating a writable copy of its shared data");
|
|
data = new Data(*_data.get());
|
|
}
|
|
else {
|
|
//extreme("Bytes is creating its own data because shared is empty");
|
|
data = new Data();
|
|
}
|
|
_data = SharedData(data);
|
|
_owner = true;
|
|
}
|
|
}
|
|
|
|
int8_t Bytes::compare(const Bytes& bytes) const {
|
|
if (_data == bytes._data) {
|
|
return 0;
|
|
}
|
|
else if (!_data) {
|
|
return -1;
|
|
}
|
|
else if (!bytes._data) {
|
|
return 1;
|
|
}
|
|
else if (*_data < *(bytes._data)) {
|
|
return -1;
|
|
}
|
|
else if (*_data > *(bytes._data)) {
|
|
return 1;
|
|
}
|
|
else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
void Bytes::assignHex(const char* hex) {
|
|
// if assignment is empty then clear data and don't bother creating new
|
|
if (hex == nullptr || hex[0] == 0) {
|
|
_data = nullptr;
|
|
_owner = true;
|
|
return;
|
|
}
|
|
newData();
|
|
size_t len = strlen(hex);
|
|
for (size_t i = 0; i < len; i += 2) {
|
|
uint8_t byte = (hex[i] % 32 + 9) % 25 * 16 + (hex[i+1] % 32 + 9) % 25;
|
|
_data->push_back(byte);
|
|
}
|
|
}
|
|
|
|
void Bytes::appendHex(const char* hex) {
|
|
// if append is empty then do nothing
|
|
if (hex == nullptr || hex[0] == 0) {
|
|
return;
|
|
}
|
|
ownData();
|
|
size_t len = strlen(hex);
|
|
for (size_t i = 0; i < len; i += 2) {
|
|
uint8_t byte = (hex[i] % 32 + 9) % 25 * 16 + (hex[i+1] % 32 + 9) % 25;
|
|
_data->push_back(byte);
|
|
}
|
|
}
|
|
|
|
const char hex_upper_chars[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
|
|
const char hex_lower_chars[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
|
|
|
|
std::string RNS::hexFromByte(uint8_t byte, bool upper /*= true*/) {
|
|
std::string hex;
|
|
if (upper) {
|
|
hex += hex_upper_chars[ (byte& 0xF0) >> 4];
|
|
hex += hex_upper_chars[ (byte& 0x0F) >> 0];
|
|
}
|
|
else {
|
|
hex += hex_lower_chars[ (byte& 0xF0) >> 4];
|
|
hex += hex_lower_chars[ (byte& 0x0F) >> 0];
|
|
}
|
|
return hex;
|
|
}
|
|
|
|
std::string Bytes::toHex(bool upper /*= true*/) const {
|
|
if (!_data) {
|
|
return "";
|
|
}
|
|
std::string hex;
|
|
for (uint8_t byte : *_data) {
|
|
if (upper) {
|
|
hex += hex_upper_chars[ (byte& 0xF0) >> 4];
|
|
hex += hex_upper_chars[ (byte& 0x0F) >> 0];
|
|
}
|
|
else {
|
|
hex += hex_lower_chars[ (byte& 0xF0) >> 4];
|
|
hex += hex_lower_chars[ (byte& 0x0F) >> 0];
|
|
}
|
|
}
|
|
return hex;
|
|
}
|
|
|
|
// mid
|
|
Bytes Bytes::mid(size_t beginpos, size_t len) const {
|
|
if (!_data || beginpos >= size()) {
|
|
return NONE;
|
|
}
|
|
if ((beginpos + len) >= size()) {
|
|
len = (size() - beginpos);
|
|
}
|
|
return {data() + beginpos, len};
|
|
}
|
|
|
|
// to end
|
|
Bytes Bytes::mid(size_t beginpos) const {
|
|
if (!_data || beginpos >= size()) {
|
|
return NONE;
|
|
}
|
|
return {data() + beginpos, size() - beginpos};
|
|
}
|