feat(big): add SBigToUnsigned

This commit is contained in:
Adam Heinermann 2024-11-17 04:02:44 -08:00 committed by fallenoak
parent 208dd8a2a5
commit aaa44dd400
6 changed files with 37 additions and 1 deletions

View file

@ -143,6 +143,10 @@ void SBigToBinaryBuffer(BigData* num, uint8_t* data, uint32_t maxBytes, uint32_t
} }
} }
void SBigToUnsigned(BigData* num, uint32_t* val) {
ToUnsigned(val, num->Primary());
}
void SBigXor(BigData* a, BigData* b, BigData* c) { void SBigXor(BigData* a, BigData* b, BigData* c) {
Xor(a->Primary(), b->Primary(), c->Primary()); Xor(a->Primary(), b->Primary(), c->Primary());
} }

View file

@ -60,4 +60,6 @@ void SBigToBinaryBuffer(BigData* num, uint8_t* data, uint32_t maxBytes, uint32_t
void SBigXor(BigData* a, BigData* b, BigData* c); void SBigXor(BigData* a, BigData* b, BigData* c);
void SBigToUnsigned(BigData* num, uint32_t* val);
#endif #endif

View file

@ -483,6 +483,11 @@ void ToStream(TSGrowableArray<uint8_t>& output, const BigBuffer& buffer) {
ToBinaryAppend(output, buffer); ToBinaryAppend(output, buffer);
} }
void ToUnsigned(uint32_t* a, const BigBuffer& b) {
*a = 0;
*a = b[0];
}
void Xor(BigBuffer& a, const BigBuffer& b, const BigBuffer& c) { void Xor(BigBuffer& a, const BigBuffer& b, const BigBuffer& c) {
uint32_t i = 0; uint32_t i = 0;
for (; b.IsUsed(i) || c.IsUsed(i); i++) { for (; b.IsUsed(i) || c.IsUsed(i); i++) {

View file

@ -75,6 +75,8 @@ void ToBinary(TSGrowableArray<uint8_t>& output, const BigBuffer& buffer);
void ToStream(TSGrowableArray<uint8_t>& output, const BigBuffer& buffer); void ToStream(TSGrowableArray<uint8_t>& output, const BigBuffer& buffer);
void ToUnsigned(uint32_t* a, const BigBuffer& b);
void Xor(BigBuffer& a, const BigBuffer& b, const BigBuffer& c); void Xor(BigBuffer& a, const BigBuffer& b, const BigBuffer& c);
#endif #endif

View file

@ -746,6 +746,30 @@ TEST_CASE("SBigToBinaryBuffer", "[big]") {
} }
} }
TEST_CASE("SBigToUnsigned", "[big]") {
BigDataTest num;
SECTION("converts bignum values to uint") {
auto v = GENERATE(0UL, 1UL, 1000UL, UINT32_MAX);
SBigFromUnsigned(num, v);
uint32_t result;
SBigToUnsigned(num, &result);
CHECK(result == v);
}
SECTION("truncates large values") {
SBigFromStr(num, std::to_string(0x123456789ABCDEFULL).c_str());
uint32_t result;
SBigToUnsigned(num, &result);
CHECK(result == 0x89ABCDEF);
}
}
TEST_CASE("SBigXor", "[big]") { TEST_CASE("SBigXor", "[big]") {
BigDataTest a, b, c; BigDataTest a, b, c;

View file

@ -1070,7 +1070,6 @@ TEST_CASE("Sub", "[big]") {
} }
} }
TEST_CASE("ToStream", "[big]") { TEST_CASE("ToStream", "[big]") {
BigDataTest a; BigDataTest a;