From 6c830703802ea0281abfc1a19967a259d111238f Mon Sep 17 00:00:00 2001 From: fallenoak Date: Sun, 29 Jan 2023 20:37:09 -0600 Subject: [PATCH] feat(big): add SBigFromBinary --- storm/Big.cpp | 4 ++++ storm/Big.hpp | 2 ++ storm/big/BigBuffer.cpp | 4 ++++ storm/big/BigBuffer.hpp | 1 + storm/big/Ops.cpp | 10 ++++++++++ storm/big/Ops.hpp | 2 ++ test/Big.cpp | 43 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 66 insertions(+) diff --git a/storm/Big.cpp b/storm/Big.cpp index a6db9da..89a94be 100644 --- a/storm/Big.cpp +++ b/storm/Big.cpp @@ -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); } diff --git a/storm/Big.hpp b/storm/Big.hpp index 55b7a3e..c1d42e5 100644 --- a/storm/Big.hpp +++ b/storm/Big.hpp @@ -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); diff --git a/storm/big/BigBuffer.cpp b/storm/big/BigBuffer.cpp index c2280f2..4bafa49 100644 --- a/storm/big/BigBuffer.cpp +++ b/storm/big/BigBuffer.cpp @@ -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; } diff --git a/storm/big/BigBuffer.hpp b/storm/big/BigBuffer.hpp index 9f6919c..0266996 100644 --- a/storm/big/BigBuffer.hpp +++ b/storm/big/BigBuffer.hpp @@ -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; diff --git a/storm/big/Ops.cpp b/storm/big/Ops.cpp index cc15f64..efd3db3 100644 --- a/storm/big/Ops.cpp +++ b/storm/big/Ops.cpp @@ -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(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); diff --git a/storm/big/Ops.hpp b/storm/big/Ops.hpp index 096ca48..880a5df 100644 --- a/storm/big/Ops.hpp +++ b/storm/big/Ops.hpp @@ -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); diff --git a/test/Big.cpp b/test/Big.cpp index 146ccf0..5897afc 100644 --- a/test/Big.cpp +++ b/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(&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(&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(&data), sizeof(data)); + + uint8_t buffer[8]; + uint32_t bytes; + SBigToBinaryBuffer(num, buffer, sizeof(buffer), &bytes); + + CHECK(bytes == 8); + CHECK(*reinterpret_cast(buffer) == 0x123456789ABCDEF0); + + SBigDel(num); + } }