@@ -119,7 +119,7 @@ function writeChunk(b64Str, chunk, dstOffset, uint8) {
119
119
return offset ;
120
120
}
121
121
122
- function toArrayBuffer ( b64Str ) {
122
+ export function toArrayBuffer ( b64Str ) {
123
123
const chunks = extractChunks ( b64Str ) ;
124
124
const totalEncodedLength = chunks [ chunks . length - 1 ] . end + 1 ;
125
125
const padding = ( 4 - ( totalEncodedLength % 4 ) ) % 4 ; // -length mod 4
@@ -138,6 +138,45 @@ function toArrayBuffer(b64Str) {
138
138
return arrayBuffer ;
139
139
}
140
140
141
+ function encodeTriplet ( v1 , v2 , v3 ) {
142
+ const triplet = ( v1 << 16 ) + ( v2 << 8 ) + v3 ;
143
+ return (
144
+ BASE64_CODE [ triplet >> 18 ] +
145
+ BASE64_CODE [ ( triplet >> 12 ) & 0x3f ] +
146
+ BASE64_CODE [ ( triplet >> 6 ) & 0x3f ] +
147
+ BASE64_CODE [ triplet & 0x3f ]
148
+ ) ;
149
+ }
150
+
151
+ export function fromArrayBuffer ( ab ) {
152
+ const uint8 = new Uint8Array ( ab ) ;
153
+ const leftoverLength = ab . byteLength % 3 ;
154
+ const maxTripletIndex = ab . byteLength - leftoverLength ;
155
+ const segments = Array ( maxTripletIndex / 3 ) ;
156
+ for ( let i = 0 ; i < segments . length ; i ++ ) {
157
+ const bufOffset = i * 3 ;
158
+ segments [ i ] = encodeTriplet (
159
+ uint8 [ bufOffset ] ,
160
+ uint8 [ bufOffset + 1 ] ,
161
+ uint8 [ bufOffset + 2 ]
162
+ ) ;
163
+ }
164
+ if ( leftoverLength > 0 ) {
165
+ const segment = encodeTriplet (
166
+ uint8 [ maxTripletIndex ] ,
167
+ uint8 [ maxTripletIndex + 1 ] || 0 ,
168
+ uint8 [ maxTripletIndex + 2 ] || 0
169
+ ) ;
170
+ if ( leftoverLength === 1 ) {
171
+ segments . push ( `${ segment . substr ( 0 , 2 ) } ==` ) ;
172
+ } else if ( leftoverLength === 2 ) {
173
+ segments . push ( `${ segment . substr ( 0 , 3 ) } =` ) ;
174
+ }
175
+ }
176
+ return segments . join ( '' ) ;
177
+ }
178
+
141
179
export default {
142
180
toArrayBuffer,
181
+ fromArrayBuffer,
143
182
} ;
0 commit comments