base64.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. var b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  2. var b64pad="=";
  3. function hex2b64(h) {
  4. var i;
  5. var c;
  6. var ret = "";
  7. for(i = 0; i+3 <= h.length; i+=3) {
  8. c = parseInt(h.substring(i,i+3),16);
  9. ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63);
  10. }
  11. if(i+1 == h.length) {
  12. c = parseInt(h.substring(i,i+1),16);
  13. ret += b64map.charAt(c << 2);
  14. }
  15. else if(i+2 == h.length) {
  16. c = parseInt(h.substring(i,i+2),16);
  17. ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4);
  18. }
  19. while((ret.length & 3) > 0) ret += b64pad;
  20. return ret;
  21. }
  22. // convert a base64 string to hex
  23. function b64tohex(s) {
  24. var ret = ""
  25. var i;
  26. var k = 0; // b64 state, 0-3
  27. var slop;
  28. for(i = 0; i < s.length; ++i) {
  29. if(s.charAt(i) == b64pad) break;
  30. v = b64map.indexOf(s.charAt(i));
  31. if(v < 0) continue;
  32. if(k == 0) {
  33. ret += int2char(v >> 2);
  34. slop = v & 3;
  35. k = 1;
  36. }
  37. else if(k == 1) {
  38. ret += int2char((slop << 2) | (v >> 4));
  39. slop = v & 0xf;
  40. k = 2;
  41. }
  42. else if(k == 2) {
  43. ret += int2char(slop);
  44. ret += int2char(v >> 2);
  45. slop = v & 3;
  46. k = 3;
  47. }
  48. else {
  49. ret += int2char((slop << 2) | (v >> 4));
  50. ret += int2char(v & 0xf);
  51. k = 0;
  52. }
  53. }
  54. if(k == 1)
  55. ret += int2char(slop << 2);
  56. return ret;
  57. }
  58. // convert a base64 string to a byte/number array
  59. function b64toBA(s) {
  60. //piggyback on b64tohex for now, optimize later
  61. var h = b64tohex(s);
  62. var i;
  63. var a = new Array();
  64. for(i = 0; 2*i < h.length; ++i) {
  65. a[i] = parseInt(h.substring(2*i,2*i+2),16);
  66. }
  67. return a;
  68. }