fork download
  1. // Create Base64 Object
  2. var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/\r\n/g,"\n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}
  3.  
  4. function detect_img(encoded, Base64) {
  5. // Define the string, also meaning that you need to know the file extension
  6. //var encoded = "Base64 encoded image returned from your service";
  7.  
  8. // Decode the string
  9. var decoded = Base64.decode(encoded);
  10. //console.log(decoded);
  11.  
  12. // if the file extension is unknown
  13. var extension = undefined;
  14. // do something like this
  15. var lowerCase = decoded.toLowerCase();
  16. if (lowerCase.indexOf("png") !== -1) extension = "png"
  17. else if (lowerCase.indexOf("jpg") !== -1 || lowerCase.indexOf("jpeg") !== -1)
  18. extension = "jpg"
  19. else extension = "tiff";
  20.  
  21. // and then to display the image
  22. //var img = document.createElement("img");
  23. //img.src = decoded;
  24.  
  25. // alternatively, you can do this
  26. //img.src = "data:image/" + extension + ";base64," + encoded;
  27. return extension;
  28. }
  29.  
  30. imgs = {
  31. "img.bmp": "Qk2KAwAAAAAAAIoAAAB8AAAAGAAAAAgAAAABACAAAwAAAAADAAATCwAAEwsAAAAAAAAAAAAAAAD/AAD/AAD/AAAAAAAA/0JHUnMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAA////////////////UE5H/1BOR/9QTkf/UE5H////////////UE5H/////////////////1BOR///////UE5H////////////////////////////////////////////////////////////UE5H/////////////////1BOR///////UE5H/////////////////1BOR///////UE5H////////////////////////////////////////////////////////////UE5H/////////////////1BOR///////UE5H/////////////////1BOR///////UE5H////////////////////////////////////////////////////////////UE5H/1BOR/9QTkf/UE5H////////////UE5H/////////////////1BOR///////UE5H/1BOR/9QTkf/UE5H////////////////////////////////////////////UE5H/////////////////1BOR///////UE5H//////9QTkf//////1BOR///////UE5H/////////////////1BOR///////////////////////////////////////UE5H/////////////////1BOR///////UE5H/1BOR///////UE5H/1BOR///////UE5H/////////////////1BOR///////////////////////////////////////UE5H/1BOR/9QTkf/UE5H////////////UE5H/////////////////1BOR///////UE5H/1BOR/9QTkf/UE5H////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////",
  32. "img.gif": "R0lGODlhGAAIAIABACYmJv///yH+A1BORwAh+QQBCgABACwAAAAAGAAIAAACHYyPqXvgBoJ7rNkYa8pXb/lglMdhkoeUJ4eCmckUADs=",
  33. "img.jpeg": "/9j/4AAQSkZJRgABAQEASABIAAD//gAFUE5H/9sAQwADAgIDAgIDAwMDBAMDBAUIBQUEBAUKBwcGCAwKDAwLCgsLDQ4SEA0OEQ4LCxAWEBETFBUVFQwPFxgWFBgSFBUU/9sAQwEDBAQFBAUJBQUJFA0LDRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8IAEQgACAAYAwERAAIRAQMRAf/EABYAAAMAAAAAAAAAAAAAAAAAAAQFB//EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAawAjI//xAAZEAEAAwEBAAAAAAAAAAAAAAAEAQMFAgb/2gAIAQEAAQUC9G/tCWxZntC2ydz/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AX//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AX//xAAkEAACAgEDAgcAAAAAAAAAAAABAwIRBAASIQVRFCIxMkFDUv/aAAgBAQAGPwJasN07hS3LiySqkchAAkRzGxvo9rrXT05+WEY7A6WyXUmLEBavs9WH3Gj+q+NQgZmb5OdFsPEndCAM9lpqhGgvzcHkd+f/xAAZEAEBAQEBAQAAAAAAAAAAAAABESEAMYH/2gAIAQEAAT8hTB+CdTAxrVHIBoCkAGdpx9VC8XbL7snT5jZ3b7//2gAMAwEAAgADAAAAEBJ//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxB//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxB//8QAGBABAAMBAAAAAAAAAAAAAAAAAQARITH/2gAIAQEAAT8QuOimHFedNNz6rOMpcMA7FYGDCS91tSxBSnIxf//Z",
  34. "img.png": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAICAYAAADjoT9jAAAAXUlEQVQoz7VRwQ0AIQgTwyzdf54u471IGkIUTa4vi0JbHONnmBIASzlJi3qcM9cefVMiCwQHsPRO66cEsxuVpHUGZvguxTFyo8crp7cuq/+4XtHrmvzFbYhkwSr9B/CFOdb5KVaaAAAAAElFTkSuQmCC",
  35. "img.tiff": "SUkqAAgDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmJib/JiYm/yYmJv8mJib/JiYm/wAAAAAmJib/AAAAACYmJv8mJib/JiYm/yYmJv8AAAAAJiYm/yYmJv8mJib/JiYm/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYmJv8AAAAAAAAAAAAAAAAmJib/AAAAACYmJv8AAAAAAAAAAAAAAAAAAAAAJiYm/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYmJv8AAAAAAAAAAAAAAAAmJib/AAAAACYmJv8AAAAAAAAAAAAAAAAAAAAAJiYm/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYmJv8AAAAAAAAAAAAAAAAmJib/AAAAACYmJv8mJib/JiYm/wAAAAAAAAAAJiYm/yYmJv8mJib/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYmJv8AAAAAAAAAAAAAAAAmJib/AAAAACYmJv8AAAAAAAAAAAAAAAAAAAAAJiYm/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYmJv8AAAAAAAAAAAAAAAAmJib/AAAAACYmJv8AAAAAAAAAAAAAAAAAAAAAJiYm/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYmJv8AAAAAAAAAAAAAAAAmJib/AAAAACYmJv8AAAAAAAAAAAAAAAAAAAAAJiYm/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAAABAwABAAAAGAAAAAEBAwABAAAACAAAAAIBAwAEAAAAAgQAAAMBAwABAAAAAQAAAAYBAwABAAAAAgAAAA0BAgA7AAAAEgQAAA4BAgAEAAAAUE5HABEBBAABAAAACAAAABIBAwABAAAAAQAAABUBAwABAAAABAAAABYBAwABAAAAgAAAABcBBAABAAAAAAMAABoBBQABAAAA8gMAABsBBQABAAAA+gMAABwBAwABAAAAAQAAAB0BAgAHAAAATgQAACgBAwABAAAAAgAAAFIBAwABAAAAAQAAAFMBAwAEAAAACgQAAAAAAABIAAAAAQAAAEgAAAABAAAACAAIAAgACAABAAEAAQABAEM6XFVzZXJzXGdyZWdvXFByb2plY3RzXFNPIHRlc3RcYmFzZXI2NGltZ19kZXRlY3RcaW1nLnRpZmYAAE96YWRqZQA="
  36. }
  37.  
  38. function test(imgs, Base64) {
  39. for (const [name, base64data] of Object.entries(imgs)) {
  40. const header = [...atob(base64data)]
  41. .slice(0, 16)
  42. .map(c => c.charCodeAt(0))
  43. .filter(c => 32 <= c && c <= 126)
  44. .map(c => String.fromCharCode(c))
  45. .join("")
  46. ;
  47. console.log(name);
  48. console.log(" header:", header);
  49. console.log(" deteted:", detect_img(base64data, Base64));
  50. }
  51. }
  52. console.log("=== Broken Base64 ===");
  53. test(imgs, Base64);
  54. console.log();
  55. console.log("=== Proper Base64 ===");
  56. test(imgs, {decode:b64 => atob(b64)});
Success #stdin #stdout 0.07s 43304KB
stdin
Standard input is empty
stdout
=== Broken Base64 ===
img.bmp
  header: BM|
  deteted: png
img.gif
  header: GIF89a&&&
  deteted: tiff
img.jpeg
  header: JFIFH
  deteted: png
img.png
  header: PNGIHDR
  deteted: tiff
img.tiff
  header: II*
  deteted: png

=== Proper Base64 ===
img.bmp
  header: BM|
  deteted: png
img.gif
  header: GIF89a&&&
  deteted: png
img.jpeg
  header: JFIFH
  deteted: png
img.png
  header: PNGIHDR
  deteted: png
img.tiff
  header: II*
  deteted: png