diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/base64.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/src/base64.c b/src/base64.c index 2326168..65c6061 100644 --- a/src/base64.c +++ b/src/base64.c | |||
| @@ -53,20 +53,18 @@ char *base64encode(const unsigned char *buf, size_t *size) | |||
| 53 | unsigned char input[3]; | 53 | unsigned char input[3]; |
| 54 | unsigned int output[4]; | 54 | unsigned int output[4]; |
| 55 | while (n < *size) { | 55 | while (n < *size) { |
| 56 | input[0] = buf[n++]; | 56 | input[0] = buf[n]; |
| 57 | input[1] = (n < *size) ? buf[n++] : 0; | 57 | input[1] = (n+1 < *size) ? buf[n+1] : 0; |
| 58 | input[2] = (n < *size) ? buf[n++] : 0; | 58 | input[2] = (n+2 < *size) ? buf[n+2] : 0; |
| 59 | output[0] = input[0] >> 2; | 59 | output[0] = input[0] >> 2; |
| 60 | output[1] = ((input[0] & 3) << 4) + (input[1] >> 4); | 60 | output[1] = ((input[0] & 3) << 4) + (input[1] >> 4); |
| 61 | output[2] = ((input[1] & 15) << 2) + (input[2] >> 6); | 61 | output[2] = ((input[1] & 15) << 2) + (input[2] >> 6); |
| 62 | output[3] = input[2] & 63; | 62 | output[3] = input[2] & 63; |
| 63 | outbuf[m++] = base64_str[(int)output[0]]; | 63 | outbuf[m++] = base64_str[(int)output[0]]; |
| 64 | outbuf[m++] = base64_str[(int)output[1]]; | 64 | outbuf[m++] = base64_str[(int)output[1]]; |
| 65 | outbuf[m++] = base64_str[(int)output[2]]; | 65 | outbuf[m++] = (n+1 < *size) ? base64_str[(int)output[2]] : base64_pad; |
| 66 | outbuf[m++] = base64_str[(int)output[3]]; | 66 | outbuf[m++] = (n+2 < *size) ? base64_str[(int)output[3]] : base64_pad; |
| 67 | } | 67 | n+=3; |
| 68 | while ((m % 4) != 0) { | ||
| 69 | outbuf[m++] = base64_pad; | ||
| 70 | } | 68 | } |
| 71 | outbuf[m] = 0; // 0-termination! | 69 | outbuf[m] = 0; // 0-termination! |
| 72 | *size = m; | 70 | *size = m; |
