55 lines
1.7 KiB
C++
55 lines
1.7 KiB
C++
/**
|
|
* @file Base64.h
|
|
* @brief Inline Base64 encoder.
|
|
*
|
|
* Used exclusively for the WebSocket HTTP upgrade handshake.
|
|
*/
|
|
|
|
#ifndef STREAMHUB_BASE64_H_
|
|
#define STREAMHUB_BASE64_H_
|
|
|
|
#include "CompilerTypes.h"
|
|
|
|
namespace StreamHub {
|
|
|
|
using MARTe::uint8;
|
|
using MARTe::uint32;
|
|
|
|
static const char kBase64Chars[] =
|
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
|
|
/**
|
|
* @brief Base64-encode @p inLen bytes from @p in into @p out (null-terminated).
|
|
* @param out Must have room for at least ceil(inLen/3)*4 + 1 bytes.
|
|
* @return Number of characters written (excluding null terminator).
|
|
*/
|
|
inline uint32 Base64Encode(const uint8 *in, uint32 inLen, char *out) {
|
|
uint32 outIdx = 0u;
|
|
uint32 i = 0u;
|
|
while (i + 3u <= inLen) {
|
|
out[outIdx++] = kBase64Chars[(in[i] >> 2u) & 0x3Fu];
|
|
out[outIdx++] = kBase64Chars[((in[i] & 0x03u) << 4u) | ((in[i+1u] >> 4u) & 0x0Fu)];
|
|
out[outIdx++] = kBase64Chars[((in[i+1u] & 0x0Fu) << 2u) | ((in[i+2u] >> 6u) & 0x03u)];
|
|
out[outIdx++] = kBase64Chars[in[i+2u] & 0x3Fu];
|
|
i += 3u;
|
|
}
|
|
uint32 rem = inLen - i;
|
|
if (rem == 1u) {
|
|
out[outIdx++] = kBase64Chars[(in[i] >> 2u) & 0x3Fu];
|
|
out[outIdx++] = kBase64Chars[(in[i] & 0x03u) << 4u];
|
|
out[outIdx++] = '=';
|
|
out[outIdx++] = '=';
|
|
} else if (rem == 2u) {
|
|
out[outIdx++] = kBase64Chars[(in[i] >> 2u) & 0x3Fu];
|
|
out[outIdx++] = kBase64Chars[((in[i] & 0x03u) << 4u) | ((in[i+1u] >> 4u) & 0x0Fu)];
|
|
out[outIdx++] = kBase64Chars[(in[i+1u] & 0x0Fu) << 2u];
|
|
out[outIdx++] = '=';
|
|
}
|
|
out[outIdx] = '\0';
|
|
return outIdx;
|
|
}
|
|
|
|
} /* namespace StreamHub */
|
|
|
|
#endif /* STREAMHUB_BASE64_H_ */
|