Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
git-svn-id: http://svn.coderepos.org/share/lang/javascript/Base64/trunk@30681 d0d07461-0603-4401-acd4-de1884942a52
- Loading branch information
dankogai
committed
Mar 1, 2009
1 parent
f71de01
commit 88b7a37
Showing
4 changed files
with
87 additions
and
576 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,215 +1,126 @@ | ||
/* | ||
* $Id: base64.js,v 0.9 2009/03/01 20:51:18 dankogai Exp dankogai $ | ||
* $Id: base64.js,v 1.0 2009/03/01 22:00:51 dankogai Exp dankogai $ | ||
* | ||
* History: | ||
* dankogai's original: character-based | ||
* drry's fix: split string to array then join | ||
* new version: regexp-based | ||
*/ | ||
|
||
(function(){ | ||
|
||
var b64chars | ||
var b64chars | ||
= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; | ||
|
||
var b64charcodes = function(){ | ||
var a = []; | ||
var codeA = 'A'.charCodeAt(0); | ||
var codea = 'a'.charCodeAt(0); | ||
var code0 = '0'.charCodeAt(0); | ||
for (var i = 0; i < 26; i ++) a.push(codeA + i); | ||
for (var i = 0; i < 26; i ++) a.push(codea + i); | ||
for (var i = 0; i < 10; i ++) a.push(code0 + i); | ||
a.push('+'.charCodeAt(0)); | ||
a.push('/'.charCodeAt(0)); | ||
return a; | ||
}(); | ||
|
||
var b64tab = function(bin){ | ||
var t = {}; | ||
for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i; | ||
return t; | ||
}(b64chars); | ||
|
||
var stringToArray = function(s){ | ||
var a = []; | ||
for (var i = 0, l = s.length; i < l; i ++) a[i] = s.charCodeAt(i); | ||
return a; | ||
var sub_toBase64 = function(m){ | ||
var n = (m.charCodeAt(0) << 16) | ||
| (m.charCodeAt(1) << 8) | ||
| (m.charCodeAt(2) ); | ||
return b64chars.charAt( n >>> 18) | ||
+ b64chars.charAt((n >>> 12) & 63) | ||
+ b64chars.charAt((n >>> 6) & 63) | ||
+ b64chars.charAt( n & 63); | ||
}; | ||
|
||
var convertUTF8ArrayToBase64 = function(bin){ | ||
var toBase64 = function(bin){ | ||
if (bin.match(/[^\x00-\xFF]/)) throw 'unsupported character found' ; | ||
var padlen = 0; | ||
while (bin.length % 3){ | ||
bin.push(0); | ||
while(bin.length % 3) { | ||
bin += '\0'; | ||
padlen++; | ||
}; | ||
var b64 = []; | ||
for (var i = 0, l = bin.length; i < l; i += 3){ | ||
var c0 = bin[i], c1 = bin[i+1], c2 = bin[i+2]; | ||
if (c0 >= 256 || c1 >= 256 || c2 >= 256) | ||
throw 'unsupported character found'; | ||
var n = (c0 << 16) | (c1 << 8) | c2; | ||
b64.push( | ||
b64charcodes[ n >>> 18], | ||
b64charcodes[(n >>> 12) & 63], | ||
b64charcodes[(n >>> 6) & 63], | ||
b64charcodes[ n & 63] | ||
); | ||
} | ||
while (padlen--) b64[b64.length - padlen - 1] = '='.charCodeAt(0); | ||
return String.fromCharCode.apply(String, b64); | ||
var b64 = bin.replace(/[\x00-\xFF]{3}/g, sub_toBase64); | ||
if (!padlen) return b64; | ||
b64 = b64.substr(0, b64.length - padlen); | ||
while(padlen--) b64 += '='; | ||
return b64; | ||
}; | ||
|
||
var convertBase64ToUTF8Array = function(b64){ | ||
b64 = b64.replace(/[^A-Za-z0-9+\/]+/g, ''); | ||
var bin = []; | ||
var padlen = b64.length % 4; | ||
for (var i = 0, l = b64.length; i < l; i += 4){ | ||
var n = ((b64tab[b64.charAt(i )] || 0) << 18) | ||
| ((b64tab[b64.charAt(i+1)] || 0) << 12) | ||
| ((b64tab[b64.charAt(i+2)] || 0) << 6) | ||
| ((b64tab[b64.charAt(i+3)] || 0)); | ||
bin.push( | ||
( n >> 16 ), | ||
( (n >> 8) & 0xff ), | ||
( n & 0xff ) | ||
); | ||
} | ||
bin.length -= [0,0,2,1][padlen]; | ||
return bin; | ||
}; | ||
var btoa = window.btoa || toBase64; | ||
|
||
var convertUTF16ArrayToUTF8Array = function(uni){ | ||
var bin = []; | ||
for (var i = 0, l = uni.length; i < l; i++){ | ||
var n = uni[i]; | ||
if (n < 0x80) | ||
bin.push(n); | ||
else if (n < 0x800) | ||
bin.push( | ||
0xc0 | (n >>> 6), | ||
0x80 | (n & 0x3f)); | ||
else | ||
bin.push( | ||
0xe0 | ((n >>> 12) & 0x0f), | ||
0x80 | ((n >>> 6) & 0x3f), | ||
0x80 | (n & 0x3f)); | ||
} | ||
return bin; | ||
var sub_fromBase64 = function(m){ | ||
var n = (b64tab[b64.charAt(0)] << 18) | ||
| (b64tab[b64.charAt(1)] << 12) | ||
| (b64tab[b64.charAt(2)] << 6) | ||
| (b64tab[b64.charAt(3)]); | ||
return String.fromCharCode( n >> 16 ) | ||
+ String.fromCharCode( (n >> 8) & 0xff ) | ||
+ String.fromCharCode( n & 0xff ); | ||
}; | ||
|
||
var convertUTF8ArrayToUTF16Array = function(bin){ | ||
var uni = []; | ||
for (var i = 0, l = bin.length; i < l; i++){ | ||
var c0 = bin[i]; | ||
if (c0 < 0x80){ | ||
uni.push(c0); | ||
}else{ | ||
var c1 = bin[++i]; | ||
if (c0 < 0xe0){ | ||
uni.push(((c0 & 0x1f) << 6) | (c1 & 0x3f)); | ||
}else{ | ||
var c2 = bin[++i]; | ||
uni.push( | ||
((c0 & 0x0f) << 12) | ((c1 & 0x3f) << 6) | (c2 & 0x3f) | ||
); | ||
} | ||
} | ||
|
||
var fromBase64 = function(b64){ | ||
b64 = b64.replace(/[^A-Za-z0-9\+\/]/g, ''); | ||
var padlen = 0; | ||
while(b64.length % 4){ | ||
b64 += 'A'; | ||
padlen++; | ||
} | ||
return uni; | ||
}; | ||
|
||
var convertUTF8StringToBase64 = function(bin){ | ||
return convertUTF8ArrayToBase64(stringToArray(bin)); | ||
var bin = b64.replace(/A-Za-z0-9\+\/{4}/g, sub_fromBase64); | ||
bin.length -= [0,0,2,1][padlen]; | ||
return bin; | ||
}; | ||
|
||
var convertBase64ToUTF8String = function(b64){ | ||
return String.fromCharCode.apply(String, convertBase64ToUTF8Array(b64)); | ||
}; | ||
var atob = window.atob || fromBase64; | ||
|
||
var convertUTF8StringToUTF16Array = function(bin){ | ||
return convertUTF8ArrayToUTF16Array(stringToArray(bin)); | ||
}; | ||
var re_char_nonascii = /[^\x00-\xFF]/g; | ||
|
||
var convertUTF8ArrayToUTF16String = function(bin){ | ||
return String.fromCharCode.apply(String, convertUTF8ArrayToUTF16Array(bin)); | ||
var sub_char_nonascii = function(m){ | ||
var n = m.charCodeAt(0); | ||
return n < 0x800 ? String.fromCharCode(0xc0 | (n >>> 6)) | ||
+ String.fromCharCode(0x80 | (n & 0x3f)) | ||
: String.fromCharCode(0xe0 | ((n >>> 12) & 0x0f)) | ||
+ String.fromCharCode(0x80 | ((n >>> 6) & 0x3f)) | ||
+ String.fromCharCode(0x80 | (n & 0x3f)) | ||
; | ||
}; | ||
|
||
var convertUTF8StringToUTF16String = function(bin){ | ||
return String.fromCharCode.apply(String, convertUTF8ArrayToUTF16Array(stringToArray(bin))); | ||
var utob = function(uni){ | ||
return uni.replace(re_char_nonascii, sub_char_nonascii); | ||
}; | ||
|
||
var convertUTF16StringToUTF8Array = function(uni){ | ||
return convertUTF16ArrayToUTF8Array(stringToArray(uni)); | ||
var re_bytes_nonascii | ||
= /(?:[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3})/g; | ||
|
||
var sub_bytes_nonascii = function(m){ | ||
var c0 = m.charCodeAt(0); | ||
var c1 = m.charCodeAt(1); | ||
if(c0 < 0xe0){ | ||
return String.fromCharCode(((c0 & 0x1f) << 6) | (c1 & 0x3f)); | ||
}else{ | ||
var c2 = m.charCodeAt(2); | ||
return String.fromCharCode( | ||
((c0 & 0x0f) << 12) | ((c1 & 0x3f) << 6) | (c2 & 0x3f) | ||
); | ||
} | ||
}; | ||
|
||
var convertUTF16ArrayToUTF8String = function(uni){ | ||
return String.fromCharCode.apply(String, convertUTF16ArrayToUTF8Array(uni)); | ||
var btou = function(bin){ | ||
return bin.replace(re_bytes_nonascii, sub_bytes_nonascii); | ||
}; | ||
|
||
var convertUTF16StringToUTF8String = function(uni){ | ||
return String.fromCharCode.apply(String, convertUTF16ArrayToUTF8Array(stringToArray(uni))); | ||
}; | ||
|
||
if (window.btoa){ | ||
var btoa = window.btoa; | ||
var convertUTF16StringToBase64 = function (uni){ | ||
return btoa(convertUTF16StringToUTF8String(uni)); | ||
}; | ||
} | ||
else { | ||
var btoa = convertUTF8StringToBase64; | ||
var convertUTF16StringToBase64 = function (uni){ | ||
return convertUTF8ArrayToBase64(convertUTF16StringToUTF8Array(uni)); | ||
}; | ||
} | ||
|
||
if (window.atob){ | ||
var atob = window.atob; | ||
var convertBase64ToUTF16String = function (b64){ | ||
return convertUTF8StringToUTF16String(atob(b64)); | ||
}; | ||
} | ||
else { | ||
var atob = convertBase64ToUTF8String; | ||
var convertBase64ToUTF16String = function (b64){ | ||
return convertUTF8ArrayToUTF16String(convertBase64ToUTF8Array(b64)); | ||
}; | ||
} | ||
|
||
window.Base64 = { | ||
convertUTF8ArrayToBase64:convertUTF8ArrayToBase64, | ||
convertByteArrayToBase64:convertUTF8ArrayToBase64, | ||
convertBase64ToUTF8Array:convertBase64ToUTF8Array, | ||
convertBase64ToByteArray:convertBase64ToUTF8Array, | ||
convertUTF16ArrayToUTF8Array:convertUTF16ArrayToUTF8Array, | ||
convertUTF16ArrayToByteArray:convertUTF16ArrayToUTF8Array, | ||
convertUTF8ArrayToUTF16Array:convertUTF8ArrayToUTF16Array, | ||
convertByteArrayToUTF16Array:convertUTF8ArrayToUTF16Array, | ||
convertUTF8StringToBase64:convertUTF8StringToBase64, | ||
convertBase64ToUTF8String:convertBase64ToUTF8String, | ||
convertUTF8StringToUTF16Array:convertUTF8StringToUTF16Array, | ||
convertUTF8ArrayToUTF16String:convertUTF8ArrayToUTF16String, | ||
convertByteArrayToUTF16String:convertUTF8ArrayToUTF16String, | ||
convertUTF8StringToUTF16String:convertUTF8StringToUTF16String, | ||
convertUTF16StringToUTF8Array:convertUTF16StringToUTF8Array, | ||
convertUTF16StringToByteArray:convertUTF16StringToUTF8Array, | ||
convertUTF16ArrayToUTF8String:convertUTF16ArrayToUTF8String, | ||
convertUTF16StringToUTF8String:convertUTF16StringToUTF8String, | ||
convertUTF16StringToBase64:convertUTF16StringToBase64, | ||
convertBase64ToUTF16String:convertBase64ToUTF16String, | ||
fromBase64:convertBase64ToUTF8String, | ||
toBase64:convertUTF8StringToBase64, | ||
if (!this['Base64']) Base64 = { | ||
fromBase64:fromBase64, | ||
toBase64:toBase64, | ||
atob:atob, | ||
btoa:btoa, | ||
utob:convertUTF16StringToUTF8String, | ||
btou:convertUTF8StringToUTF16String, | ||
encode:convertUTF16StringToBase64, | ||
utob:utob, | ||
btou:btou, | ||
encode:function(u){ return btoa(utob(u)) }, | ||
encodeURI:function(u){ | ||
return convertUTF16StringToBase64(u).replace(/[+\/]/g, function(m0){ | ||
return btoa(utob(u)).replace(/[+\/]/g, function(m0){ | ||
return m0 == '+' ? '-' : '_'; | ||
}).replace(/=+$/, ''); | ||
}, | ||
decode:function(a){ | ||
return convertBase64ToUTF16String(a.replace(/[-_]/g, function(m0){ | ||
decode:function(a){ | ||
return btou(atob(a.replace(/[-_]/g, function(m0){ | ||
return m0 == '-' ? '+' : '/'; | ||
})); | ||
}))); | ||
} | ||
}; | ||
|
||
})(); | ||
})(); |
Oops, something went wrong.