Implement base64 decoder.
This commit is contained in:
parent
321e24c417
commit
30ec019512
@ -800,5 +800,14 @@ int guac_protocol_send_clipboard(guac_socket* socket, const char* data);
|
|||||||
*/
|
*/
|
||||||
int guac_protocol_send_name(guac_socket* socket, const char* name);
|
int guac_protocol_send_name(guac_socket* socket, const char* name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decodes the given base64-encoded string in-place. The base64 string must
|
||||||
|
* be NULL-terminated.
|
||||||
|
*
|
||||||
|
* @param base64 The base64-encoded string to decode.
|
||||||
|
* @return The number of bytes resulting from the decode operation.
|
||||||
|
*/
|
||||||
|
int guac_protocol_decode_base64(char* base64);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1248,3 +1248,62 @@ int guac_protocol_send_video(guac_socket* socket, const guac_stream* stream,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value of a single base64 character.
|
||||||
|
*/
|
||||||
|
static int __guac_base64_value(char c) {
|
||||||
|
|
||||||
|
if (c >= 'A' && c <= 'Z')
|
||||||
|
return c - 'A';
|
||||||
|
|
||||||
|
if (c >= 'a' && c <= 'z')
|
||||||
|
return c - 'a' + 26;
|
||||||
|
|
||||||
|
if (c >= '0' && c <= '9')
|
||||||
|
return c - '0' + 52;
|
||||||
|
|
||||||
|
if (c == '+')
|
||||||
|
return 62;
|
||||||
|
|
||||||
|
if (c == '/')
|
||||||
|
return 63;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int guac_protocol_decode_base64(char* base64) {
|
||||||
|
|
||||||
|
char* input = base64;
|
||||||
|
char* output = base64;
|
||||||
|
|
||||||
|
int length = 0;
|
||||||
|
int bits_read = 0;
|
||||||
|
int value = 0;
|
||||||
|
char current;
|
||||||
|
|
||||||
|
/* For all characters in string */
|
||||||
|
while ((current = *(input++)) != 0) {
|
||||||
|
|
||||||
|
/* If we've reached padding, then we're done */
|
||||||
|
if (current == '=')
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Otherwise, shift on the latest 6 bits */
|
||||||
|
value = (value << 6) | __guac_base64_value(current);
|
||||||
|
bits_read += 6;
|
||||||
|
|
||||||
|
/* If we have at least one byte, write out the latest whole byte */
|
||||||
|
if (bits_read >= 8) {
|
||||||
|
*(output++) = (value >> (bits_read % 8)) & 0xFF;
|
||||||
|
bits_read -= 8;
|
||||||
|
length++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return number of bytes written */
|
||||||
|
return length;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user