Changeset 3356 for pjproject/trunk/pjlib-util/src/pjlib-util/base64.c
- Timestamp:
- Oct 26, 2010 11:53:28 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjlib-util/src/pjlib-util/base64.c
r2394 r3356 48 48 return (63); 49 49 else { 50 pj_assert(!"Should not happen as '=' should have been filtered"); 50 /* It *may* happen on bad input, so this is not a good idea. 51 * pj_assert(!"Should not happen as '=' should have been filtered"); 52 */ 51 53 return INV; 52 54 } … … 125 127 const char *buf = input->ptr; 126 128 int len = input->slen; 127 int i, j ;128 int c 1, c2, c3, c4;129 int i, j, k; 130 int c[4]; 129 131 130 132 PJ_ASSERT_RETURN(input && out && out_len, PJ_EINVAL); … … 136 138 PJ_ETOOSMALL); 137 139 138 for (i=0, j=0; i+3 < len; i+=4) { 139 c1 = base256_char(buf[i]); 140 c2 = base256_char(buf[i+1]); 141 c3 = base256_char(buf[i+2]); 142 c4 = base256_char(buf[i+3]); 140 for (i=0, j=0; i<len; ) { 141 /* Fill up c, silently ignoring invalid characters */ 142 for (k=0; k<4 && i<len; ++k) { 143 do { 144 c[k] = base256_char(buf[i++]); 145 } while (c[k]==INV && i<len); 146 } 143 147 144 out[j++] = (pj_uint8_t)((c1<<2) | ((c2 & 0x30)>>4)); 145 out[j++] = (pj_uint8_t)(((c2 & 0x0F)<<4) | ((c3 & 0x3C)>>2)); 146 out[j++] = (pj_uint8_t)(((c3 & 0x03)<<6) | (c4 & 0x3F)); 147 } 148 149 if (i < len) { 150 c1 = base256_char(buf[i]); 151 152 if (i+1 < len) 153 c2 = base256_char(buf[i+1]); 154 else 155 c2 = (INV); 156 157 if (i+2 < len) 158 c3 = base256_char(buf[i+2]); 159 else 160 c3 = (INV); 161 162 c4 = (INV); 163 164 if (c2 != INV) { 165 out[j++] = (pj_uint8_t)((c1<<2) | ((c2 & 0x30)>>4)); 166 if (c3 != INV) { 167 out[j++] = (pj_uint8_t)(((c2 & 0x0F)<<4) | ((c3 & 0x3C)>>2)); 168 if (c4 != INV) { 169 out[j++] = (pj_uint8_t)(((c3 & 0x03)<<6) | (c4 & 0x3F)); 148 if (k<4) { 149 if (k > 1) { 150 out[j++] = (pj_uint8_t)((c[0]<<2) | ((c[1] & 0x30)>>4)); 151 if (k > 2) { 152 out[j++] = (pj_uint8_t) 153 (((c[1] & 0x0F)<<4) | ((c[2] & 0x3C)>>2)); 170 154 } 171 155 } 156 break; 172 157 } 173 158 159 out[j++] = (pj_uint8_t)((c[0]<<2) | ((c[1] & 0x30)>>4)); 160 out[j++] = (pj_uint8_t)(((c[1] & 0x0F)<<4) | ((c[2] & 0x3C)>>2)); 161 out[j++] = (pj_uint8_t)(((c[2] & 0x03)<<6) | (c[3] & 0x3F)); 174 162 } 175 163
Note: See TracChangeset
for help on using the changeset viewer.