mirror of
https://github.com/thunderbrewhq/squall.git
synced 2025-12-12 02:22:30 +00:00
feat(big): add SBigXor
This commit is contained in:
parent
6a88f93619
commit
da8a663fd7
5 changed files with 63 additions and 0 deletions
|
|
@ -142,3 +142,7 @@ void SBigToBinaryBuffer(BigData* num, uint8_t* data, uint32_t maxBytes, uint32_t
|
||||||
*bytes = n;
|
*bytes = n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SBigXor(BigData* a, BigData* b, BigData* c) {
|
||||||
|
Xor(a->Primary(), b->Primary(), c->Primary());
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -58,4 +58,6 @@ void SBigSub(BigData* a, BigData* b, BigData* c);
|
||||||
|
|
||||||
void SBigToBinaryBuffer(BigData* num, uint8_t* data, uint32_t maxBytes, uint32_t* bytes);
|
void SBigToBinaryBuffer(BigData* num, uint8_t* data, uint32_t maxBytes, uint32_t* bytes);
|
||||||
|
|
||||||
|
void SBigXor(BigData* a, BigData* b, BigData* c);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -482,3 +482,12 @@ void ToStream(TSGrowableArray<uint8_t>& output, const BigBuffer& buffer) {
|
||||||
EncodeDataBytes(output, output.Count());
|
EncodeDataBytes(output, output.Count());
|
||||||
ToBinaryAppend(output, buffer);
|
ToBinaryAppend(output, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Xor(BigBuffer& a, const BigBuffer& b, const BigBuffer& c) {
|
||||||
|
uint32_t i = 0;
|
||||||
|
for (; b.IsUsed(i) || c.IsUsed(i); i++) {
|
||||||
|
a[i] = c[i] ^ b[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
a.SetCount(i);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -75,4 +75,6 @@ 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 Xor(BigBuffer& a, const BigBuffer& b, const BigBuffer& c);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
46
test/Big.cpp
46
test/Big.cpp
|
|
@ -745,3 +745,49 @@ TEST_CASE("SBigToBinaryBuffer", "[big]") {
|
||||||
CHECK(*reinterpret_cast<uint64_t*>(buffer) == 0x123456789ABCDEF0);
|
CHECK(*reinterpret_cast<uint64_t*>(buffer) == 0x123456789ABCDEF0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("SBigXor", "[big]") {
|
||||||
|
BigDataTest a, b, c;
|
||||||
|
|
||||||
|
SECTION("performs bitwise xor on small numbers") {
|
||||||
|
auto v = GENERATE(
|
||||||
|
std::make_pair(0UL, 0UL),
|
||||||
|
std::make_pair(0UL, 123UL),
|
||||||
|
std::make_pair(41689UL, 786740UL)
|
||||||
|
);
|
||||||
|
|
||||||
|
SBigFromUnsigned(b, v.first);
|
||||||
|
SBigFromUnsigned(c, v.second);
|
||||||
|
SBigXor(a, b, c);
|
||||||
|
|
||||||
|
CHECK(a->Primary().Count() == 1);
|
||||||
|
CHECK(a->Primary()[0] == (v.first ^ v.second));
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("performs bitwise xor on large number") {
|
||||||
|
SBigFromStr(b, std::to_string(0xFF00FF00FF00FF00ULL).c_str());
|
||||||
|
SBigFromStr(c, std::to_string(0xFF00FF00FF00FULL).c_str());
|
||||||
|
SBigXor(a, b, c);
|
||||||
|
|
||||||
|
CHECK(a->Primary().Count() == 2);
|
||||||
|
CHECK(a->Primary()[0] == 0xF0F0F0F);
|
||||||
|
CHECK(a->Primary()[1] == 0xFF0F0F0F);
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("performs bitwise xor on huge value") {
|
||||||
|
uint32_t data[] = { 0xF00DFEEDUL, 0xBA1DUL, 0xBEEBBEEBUL, 0x12345678UL, 0x9ABCDEFUL, 0xDEADCADUL, 0xD011AUL };
|
||||||
|
|
||||||
|
SBigFromBinary(b, data, sizeof(data));
|
||||||
|
SBigFromUnsigned(c, 0x1111111FUL);
|
||||||
|
SBigXor(a, b, c);
|
||||||
|
|
||||||
|
CHECK(a->Primary().Count() == 7);
|
||||||
|
CHECK(a->Primary()[0] == 0xE11CEFF2);
|
||||||
|
CHECK(a->Primary()[1] == data[1]);
|
||||||
|
CHECK(a->Primary()[2] == data[2]);
|
||||||
|
CHECK(a->Primary()[3] == data[3]);
|
||||||
|
CHECK(a->Primary()[4] == data[4]);
|
||||||
|
CHECK(a->Primary()[5] == data[5]);
|
||||||
|
CHECK(a->Primary()[6] == data[6]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue