17#ifndef DETERMINISTICESPASYNCWEBSERVER_DET_HEX_H
18#define DETERMINISTICESPASYNCWEBSERVER_DET_HEX_H
26 const char *H = upper ?
"0123456789ABCDEF" :
"0123456789abcdef";
27 return H[nibble & 0xF];
33 if (c >=
'0' && c <=
'9')
35 if (c >=
'a' && c <=
'f')
37 if (c >=
'A' && c <=
'F')
46inline void det_hex_encode(
const uint8_t *in,
size_t n,
char *out,
bool upper =
false)
48 const char *H = upper ?
"0123456789ABCDEF" :
"0123456789abcdef";
49 for (
size_t i = 0; i < n; i++)
51 out[2 * i] = H[(in[i] >> 4) & 0xF];
52 out[2 * i + 1] = H[in[i] & 0xF];
61inline int det_hex_decode(
const char *in,
size_t hexlen, uint8_t *out,
size_t out_cap)
63 if ((hexlen % 2) != 0 || (hexlen / 2) > out_cap)
65 for (
size_t i = 0; i < hexlen; i += 2)
71 out[i / 2] = (uint8_t)((hi << 4) | lo);
73 return (
int)(hexlen / 2);
char det_hex_digit(int nibble, bool upper=false)
Nibble 0..15 -> hex char (lowercase, or uppercase when upper).
int det_hex_decode(const char *in, size_t hexlen, uint8_t *out, size_t out_cap)
Decode exactly hexlen hex chars into out (hexlen/2 bytes).
int det_hex_val(char c)
Hex digit -> 0..15, or -1 if c is not a hex digit (either case).
void det_hex_encode(const uint8_t *in, size_t n, char *out, bool upper=false)
Encode n bytes as 2*n hex chars + NUL into out (needs cap >= 2*n+1).