byte: add bytes to string w/o allocation

pull/3673/head
Victor Julien 7 years ago
parent d62d33cdff
commit 20f9b0d9c6

@ -27,6 +27,7 @@
#include "util-byte.h"
#include "util-unittest.h"
#include "util-debug.h"
#include "util-validate.h"
/** \brief Turn byte array into string.
*
@ -71,6 +72,53 @@ char *BytesToString(const uint8_t *bytes, size_t nbytes)
return string;
}
/** \brief Turn byte array into string.
*
* All non-printables are copied over, except for '\0', which is
* turned into literal \0 in the string.
*
* \param bytes byte array
* \param nbytes number of bytes
* \param outstr[out] buffer to fill
* \param outlen size of outstr. Must be at least 2 * nbytes + 1 in size
*/
void BytesToStringBuffer(const uint8_t *bytes, size_t nbytes, char *outstr, size_t outlen)
{
DEBUG_VALIDATE_BUG_ON(outlen < (nbytes * 2 + 1));
size_t n = nbytes + 1;
size_t nulls = 0;
size_t u;
for (u = 0; u < nbytes; u++) {
if (bytes[u] == '\0')
nulls++;
}
n += nulls;
char string[n];
if (nulls == 0) {
/* no nulls */
memcpy(string, bytes, nbytes);
string[nbytes] = '\0';
} else {
/* nulls present */
char *dst = string;
for (u = 0; u < nbytes; u++) {
if (bytes[u] == '\0') {
*dst++ = '\\';
*dst++ = '0';
} else {
*dst++ = bytes[u];
}
}
*dst = '\0';
}
strlcpy(outstr, string, outlen);
}
int ByteExtractUint64(uint64_t *res, int e, uint16_t len, const uint8_t *bytes)
{
uint64_t i64;

@ -81,6 +81,7 @@
* \return string nul-terminated string or NULL on error
*/
char *BytesToString(const uint8_t *bytes, size_t nbytes);
void BytesToStringBuffer(const uint8_t *bytes, size_t nbytes, char *outstr, size_t outlen);
/**
* Extract bytes from a byte string and convert to a unint64_t.

Loading…
Cancel
Save