mirror of
https://github.com/thunderbrewhq/squall.git
synced 2025-12-12 02:22:30 +00:00
feat(big): add SBigFromBinary
This commit is contained in:
parent
902ddcf7d8
commit
6c83070380
7 changed files with 66 additions and 0 deletions
|
|
@ -7,6 +7,10 @@ void SBigDel(BigData* num) {
|
|||
delete num;
|
||||
}
|
||||
|
||||
void SBigFromBinary(BigData* num, const void* data, uint32_t bytes) {
|
||||
FromBinary(num->Primary(), data, bytes);
|
||||
}
|
||||
|
||||
void SBigFromUnsigned(BigData* num, uint32_t val) {
|
||||
FromUnsigned(num->Primary(), val);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,8 @@
|
|||
|
||||
void SBigDel(BigData* num);
|
||||
|
||||
void SBigFromBinary(BigData* num, const void* data, uint32_t bytes);
|
||||
|
||||
void SBigFromUnsigned(BigData* num, uint32_t val);
|
||||
|
||||
void SBigNew(BigData** num);
|
||||
|
|
|
|||
|
|
@ -13,6 +13,10 @@ uint32_t BigBuffer::operator[](uint32_t index) const {
|
|||
return 0;
|
||||
}
|
||||
|
||||
void BigBuffer::Clear() {
|
||||
this->m_data.SetCount(this->m_offset);
|
||||
}
|
||||
|
||||
uint32_t BigBuffer::Count() const {
|
||||
return this->m_data.Count() - this->m_offset;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ class BigBuffer {
|
|||
// Member functions
|
||||
uint32_t& operator[](uint32_t index);
|
||||
uint32_t operator[](uint32_t index) const;
|
||||
void Clear();
|
||||
uint32_t Count() const;
|
||||
void GrowToFit(uint32_t index);
|
||||
int32_t IsUsed(uint32_t index) const;
|
||||
|
|
|
|||
|
|
@ -19,6 +19,16 @@ uint32_t ExtractLowPartSx(uint64_t& value) {
|
|||
return low;
|
||||
}
|
||||
|
||||
void FromBinary(BigBuffer& buffer, const void* data, uint32_t bytes) {
|
||||
buffer.Clear();
|
||||
|
||||
for (uint32_t i = 0; i < bytes; i++) {
|
||||
auto byte = static_cast<const uint8_t*>(data)[i];
|
||||
auto v7 = (i & 3) ? buffer[i / 4] : 0;
|
||||
buffer[i / 4] = v7 + (byte << (8 * (i & 3)));
|
||||
}
|
||||
}
|
||||
|
||||
void FromUnsigned(BigBuffer& buffer, uint32_t value) {
|
||||
buffer[0] = value;
|
||||
buffer.SetCount(1);
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@ uint32_t ExtractLowPart(uint64_t& value);
|
|||
|
||||
uint32_t ExtractLowPartSx(uint64_t& value);
|
||||
|
||||
void FromBinary(BigBuffer& buffer, const void* value, uint32_t bytes);
|
||||
|
||||
void FromUnsigned(BigBuffer& buffer, uint32_t value);
|
||||
|
||||
uint64_t MakeLarge(uint32_t low, uint32_t high);
|
||||
|
|
|
|||
43
test/Big.cpp
43
test/Big.cpp
|
|
@ -68,6 +68,33 @@ TEST_CASE("MakeLarge", "[big]") {
|
|||
}
|
||||
}
|
||||
|
||||
TEST_CASE("SBigFromBinary", "[big]") {
|
||||
SECTION("creates bigdata from 0") {
|
||||
BigData* num;
|
||||
SBigNew(&num);
|
||||
uint32_t data = 0;
|
||||
SBigFromBinary(num, reinterpret_cast<uint8_t*>(&data), sizeof(data));
|
||||
|
||||
CHECK(num->Primary().Count() == 1);
|
||||
CHECK(num->Primary()[0] == 0);
|
||||
|
||||
SBigDel(num);
|
||||
}
|
||||
|
||||
SECTION("creates bigdata from 0x123456789ABCDEF0") {
|
||||
BigData* num;
|
||||
SBigNew(&num);
|
||||
uint64_t data = 0x123456789ABCDEF0;
|
||||
SBigFromBinary(num, reinterpret_cast<uint8_t*>(&data), sizeof(data));
|
||||
|
||||
CHECK(num->Primary().Count() == 2);
|
||||
CHECK(num->Primary()[0] == 0x9ABCDEF0);
|
||||
CHECK(num->Primary()[1] == 0x12345678);
|
||||
|
||||
SBigDel(num);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("SBigFromUnsigned", "[big]") {
|
||||
SECTION("creates bigdata from 0") {
|
||||
BigData* num;
|
||||
|
|
@ -121,4 +148,20 @@ TEST_CASE("SBigToBinaryBuffer", "[big]") {
|
|||
|
||||
SBigDel(num);
|
||||
}
|
||||
|
||||
SECTION("returns expected buffer for bigdata representing 0x123456789ABCDEF0") {
|
||||
BigData* num;
|
||||
SBigNew(&num);
|
||||
uint64_t data = 0x123456789ABCDEF0;
|
||||
SBigFromBinary(num, reinterpret_cast<uint8_t*>(&data), sizeof(data));
|
||||
|
||||
uint8_t buffer[8];
|
||||
uint32_t bytes;
|
||||
SBigToBinaryBuffer(num, buffer, sizeof(buffer), &bytes);
|
||||
|
||||
CHECK(bytes == 8);
|
||||
CHECK(*reinterpret_cast<uint64_t*>(buffer) == 0x123456789ABCDEF0);
|
||||
|
||||
SBigDel(num);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue