Skip to content

Commit 32a404b

Browse files
WIP: bytes2hexstring
1 parent 509858e commit 32a404b

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

runtime/strings/bytes.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,21 @@ SortBytes hook_BYTES_string2bytes(SortString s) {
162162
return hook_BYTES_bytes2string(s);
163163
}
164164

165+
string *bytes2hexstring(string *b, size_t len) {
166+
static const char hexchars[] = "0123456789abcdef";
167+
auto *result = static_cast<string *>(kore_alloc_token(sizeof(string) + len * 2));
168+
for (size_t i = 0; i < len; i++) {
169+
result->data[i * 2] = hexchars[(b->data[i] >> 4) & 0xf];
170+
result->data[i * 2 + 1] = hexchars[b->data[i] & 0xf];
171+
}
172+
init_with_len(result, len * 2);
173+
return result;
174+
}
175+
176+
SortString hook_BYTES_bytes2hexstring(SortBytes b) {
177+
return bytes2hexstring(b, len(b));
178+
}
179+
165180
SortBytes hook_BYTES_substr(SortBytes input, SortInt start, SortInt end) {
166181
uint64_t ustart = GET_UI(start);
167182
uint64_t uend = GET_UI(end);

unittests/runtime-strings/bytestest.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ mpz_ptr
2020
hook_BYTES_bytes2int(string *b, uint64_t endianness, uint64_t signedness);
2121
string *hook_BYTES_int2bytes(mpz_t len, mpz_t i, uint64_t endianness);
2222
string *hook_BYTES_bytes2string(string *b);
23+
string *hook_BYTES_bytes2hexstring(string *b);
2324
string *hook_BYTES_string2bytes(string *s);
2425
string *hook_BYTES_substr(string *b, mpz_t start, mpz_t end);
2526
string *hook_BYTES_replaceAt(string *b, mpz_t start, string *b2);
@@ -171,6 +172,19 @@ BOOST_AUTO_TEST_CASE(bytes2string) {
171172
BOOST_CHECK_EQUAL(0, memcmp(_1234->data, "1234", 4));
172173
}
173174

175+
BOOST_AUTO_TEST_CASE(bytes2hexstring) {
176+
auto empty = make_string("");
177+
auto res = hook_BYTES_bytes2hexstring(empty);
178+
BOOST_CHECK(res != empty);
179+
BOOST_CHECK_EQUAL(len(res), 0);
180+
181+
auto _00ff = make_string("\x00\xff", 2);
182+
res = hook_BYTES_bytes2hexstring(_00ff);
183+
BOOST_CHECK(res != _00ff);
184+
BOOST_CHECK_EQUAL(len(res), 4);
185+
BOOST_CHECK_EQUAL(0, memcmp(res->data, "00ff", 4));
186+
}
187+
174188
BOOST_AUTO_TEST_CASE(string2bytes) {
175189
auto empty = make_string("");
176190
auto res = hook_BYTES_string2bytes(empty);

0 commit comments

Comments
 (0)