utils: Added chunk_to_dec() function
This commit is contained in:
committed by
Tobias Brunner
parent
9381559754
commit
d72d0c0dfa
@@ -569,6 +569,57 @@ START_TEST(test_base32)
|
|||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* DEC encoding test
|
||||||
|
*/
|
||||||
|
|
||||||
|
START_TEST(test_dec)
|
||||||
|
{
|
||||||
|
typedef struct {
|
||||||
|
chunk_t in;
|
||||||
|
char *out;
|
||||||
|
} testdata_t;
|
||||||
|
|
||||||
|
testdata_t test[] = {
|
||||||
|
{ chunk_from_chars( 0x00), "0" },
|
||||||
|
{ chunk_from_chars( 0x09), "9" },
|
||||||
|
{ chunk_from_chars( 0x0a), "10" },
|
||||||
|
{ chunk_from_chars( 0x13), "19" },
|
||||||
|
{ chunk_from_chars( 0x14), "20" },
|
||||||
|
{ chunk_from_chars( 0x63), "99" },
|
||||||
|
{ chunk_from_chars( 0x64), "100" },
|
||||||
|
{ chunk_from_chars( 0x65), "101" },
|
||||||
|
{ chunk_from_chars( 0xff), "255" },
|
||||||
|
{ chunk_from_chars( 0x00, 0xff), "255" },
|
||||||
|
{ chunk_from_chars( 0x01, 0x00), "256" },
|
||||||
|
{ chunk_from_chars( 0x01, 0x03), "259" },
|
||||||
|
{ chunk_from_chars( 0x01, 0x04), "260" },
|
||||||
|
{ chunk_from_chars( 0x09, 0xff), "2559" },
|
||||||
|
{ chunk_from_chars( 0x0a, 0x00), "2560" },
|
||||||
|
{ chunk_from_chars( 0x0a, 0x01), "2561" },
|
||||||
|
{ chunk_from_chars( 0xff, 0xff), "65535" },
|
||||||
|
{ chunk_from_chars(0x00, 0xff, 0xff), "65535" },
|
||||||
|
{ chunk_from_chars(0x01, 0x00, 0x00), "65536" },
|
||||||
|
{ chunk_from_chars(0x01, 0x86, 0x9f), "99999" },
|
||||||
|
{ chunk_from_chars(0x01, 0x86, 0xa0), "100000" },
|
||||||
|
{ chunk_from_chars(0x0f, 0x42, 0x40), "1000000" },
|
||||||
|
{ chunk_from_chars(0xa9, 0x8a, 0xc7), "11111111" },
|
||||||
|
{ chunk_from_chars(0xbc, 0x61, 0x4e), "12345678" },
|
||||||
|
};
|
||||||
|
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < countof(test); i++)
|
||||||
|
{
|
||||||
|
char buf[10];
|
||||||
|
chunk_t out;
|
||||||
|
|
||||||
|
out = chunk_to_dec(test[i].in, buf);
|
||||||
|
ck_assert_str_eq(out.ptr, test[i].out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
END_TEST
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* chunk_increment test
|
* chunk_increment test
|
||||||
*/
|
*/
|
||||||
@@ -1190,6 +1241,7 @@ Suite *chunk_suite_create()
|
|||||||
tcase_add_test(tc, test_base64);
|
tcase_add_test(tc, test_base64);
|
||||||
tcase_add_test(tc, test_base32);
|
tcase_add_test(tc, test_base32);
|
||||||
tcase_add_test(tc, test_base16);
|
tcase_add_test(tc, test_base16);
|
||||||
|
tcase_add_test(tc, test_dec);
|
||||||
suite_add_tcase(s, tc);
|
suite_add_tcase(s, tc);
|
||||||
|
|
||||||
tc = tcase_create("chunk_mac");
|
tc = tcase_create("chunk_mac");
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2008-2019 Tobias Brunner
|
* Copyright (C) 2008-2019 Tobias Brunner
|
||||||
|
* Copyright (C) 2023 Andreas Steffen
|
||||||
* Copyright (C) 2005-2006 Martin Willi
|
* Copyright (C) 2005-2006 Martin Willi
|
||||||
* Copyright (C) 2005 Jan Hutter
|
* Copyright (C) 2005 Jan Hutter
|
||||||
*
|
*
|
||||||
@@ -744,6 +745,71 @@ chunk_t chunk_to_base32(chunk_t chunk, char *buf)
|
|||||||
return chunk_create(buf, len * 8 / 5);
|
return chunk_create(buf, len * 8 / 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Described in header.
|
||||||
|
*/
|
||||||
|
chunk_t chunk_to_dec(chunk_t chunk, char *buf)
|
||||||
|
{
|
||||||
|
int len, i, i_buf, i_bin = 0;
|
||||||
|
uint16_t remainder;
|
||||||
|
chunk_t bin;
|
||||||
|
|
||||||
|
/* Determine the number of needed decimal digits:
|
||||||
|
* 10^len > 2^(8*chunk.len) =>
|
||||||
|
* len > log(256) * chunk.len =>
|
||||||
|
* len > 2.4083 * chunk.len
|
||||||
|
*/
|
||||||
|
len = (int)(2.4083 * (double)chunk.len) + 1;
|
||||||
|
|
||||||
|
if (!buf)
|
||||||
|
{
|
||||||
|
buf = malloc(len + 1);
|
||||||
|
}
|
||||||
|
i_buf = len;
|
||||||
|
buf[i_buf] = '\0';
|
||||||
|
bin = chunk_clone(chunk);
|
||||||
|
while (i_bin < bin.len)
|
||||||
|
{
|
||||||
|
remainder = 0;
|
||||||
|
for (i = i_bin; i < bin.len; i++)
|
||||||
|
{
|
||||||
|
remainder = bin.ptr[i] + (remainder << 8);
|
||||||
|
if (remainder < 10)
|
||||||
|
{
|
||||||
|
remainder = bin.ptr[i];
|
||||||
|
bin.ptr[i] = 0;
|
||||||
|
if (i == i_bin)
|
||||||
|
{
|
||||||
|
i_bin++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bin.ptr[i] = remainder / 10;
|
||||||
|
remainder %= 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i_buf > 0)
|
||||||
|
{
|
||||||
|
buf[--i_buf] = 0x30 + remainder;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
chunk_free(&bin);
|
||||||
|
|
||||||
|
/* align decimal number to the start of the string */
|
||||||
|
if (i_buf > 0)
|
||||||
|
{
|
||||||
|
len -= i_buf;
|
||||||
|
|
||||||
|
for (i = 0; i <= len; i++)
|
||||||
|
{
|
||||||
|
buf[i] = buf[i + i_buf];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return chunk_create(buf, len);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Described in header.
|
* Described in header.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2008-2019 Tobias Brunner
|
* Copyright (C) 2008-2019 Tobias Brunner
|
||||||
|
* Copyright (C) 2023 Andreas Steffen
|
||||||
* Copyright (C) 2005-2008 Martin Willi
|
* Copyright (C) 2005-2008 Martin Willi
|
||||||
* Copyright (C) 2005 Jan Hutter
|
* Copyright (C) 2005 Jan Hutter
|
||||||
*
|
*
|
||||||
@@ -213,6 +214,18 @@ chunk_t chunk_from_base64(chunk_t base64, char *buf);
|
|||||||
*/
|
*/
|
||||||
chunk_t chunk_to_base32(chunk_t chunk, char *buf);
|
chunk_t chunk_to_base32(chunk_t chunk, char *buf);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a chunk of data to decimal encoding.
|
||||||
|
*
|
||||||
|
* The resulting string is '\\0' terminated, but the chunk does not include
|
||||||
|
* the '\\0'. If buf is supplied, it must hold at least (chunk.len * 2.41 + 1).
|
||||||
|
*
|
||||||
|
* @param chunk data to convert to decimal encoding
|
||||||
|
* @param buf buffer to write to, NULL to malloc
|
||||||
|
* @return chunk of encoded data
|
||||||
|
*/
|
||||||
|
chunk_t chunk_to_dec(chunk_t chunk, char *buf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free contents of a chunk
|
* Free contents of a chunk
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user