aboutsummaryrefslogtreecommitdiff
path: root/extmod/modubinascii.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2015-07-04 12:36:46 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2015-07-04 12:36:46 +0300
commite284a95cc32dcc0ed60c28eb7b3bc4384116a3bd (patch)
tree8e166a5acf6b0a606aa1992b1f733d558adaf785 /extmod/modubinascii.c
parent616986a5f351ed5a014bd25766c12bccbe83d734 (diff)
ubinascii: b2a_base64: Optimize away a modulo operation.
Diffstat (limited to 'extmod/modubinascii.c')
-rw-r--r--extmod/modubinascii.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/extmod/modubinascii.c b/extmod/modubinascii.c
index e4ae8c157..a5ca351ba 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) {