From e284a95cc32dcc0ed60c28eb7b3bc4384116a3bd Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sat, 4 Jul 2015 12:36:46 +0300 Subject: [PATCH] ubinascii: b2a_base64: Optimize away a modulo operation. --- extmod/modubinascii.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/extmod/modubinascii.c b/extmod/modubinascii.c index e4ae8c1572..a5ca351bae 100644 --- a/extmod/modubinascii.c +++ b/extmod/modubinascii.c @@ -147,17 +147,20 @@ mp_obj_t mod_binascii_b2a_base64(mp_obj_t data) { vstr_t vstr; vstr_init_len(&vstr, ((bufinfo.len != 0) ? (((bufinfo.len - 1) / 3) + 1) * 4 : 0) + 1); + + // First pass, we convert input buffer to numeric base 64 values byte *in = bufinfo.buf, *out = (byte*)vstr.buf; - for (mp_uint_t i = bufinfo.len; i >= 3; i -= 3) { + mp_uint_t i; + for (i = bufinfo.len; i >= 3; i -= 3) { *out++ = (in[0] & 0xFC) >> 2; *out++ = (in[0] & 0x03) << 4 | (in[1] & 0xF0) >> 4; *out++ = (in[1] & 0x0F) << 2 | (in[2] & 0xC0) >> 6; *out++ = in[2] & 0x3F; in += 3; } - if (bufinfo.len % 3 != 0) { + if (i != 0) { *out++ = (in[0] & 0xFC) >> 2; - if (bufinfo.len % 3 == 2) { + if (i == 2) { *out++ = (in[0] & 0x03) << 4 | (in[1] & 0xF0) >> 4; *out++ = (in[1] & 0x0F) << 2; } @@ -167,6 +170,8 @@ mp_obj_t mod_binascii_b2a_base64(mp_obj_t data) { } *out++ = 64; } + + // Second pass, we convert number base 64 values to actual base64 ascii encoding out = (byte*)vstr.buf; for (mp_uint_t i = vstr.len - 1; i--;) { if (*out < 26) {