2016-08-30 1 views
0

В основном я пытаюсь сохранить небольшой двоичный файл в моем JS-файле (в виде строки Base64). Затем во время исполнения Base64 декодирует его и просто сохраняет его на жестком диске.Как декодировать двоичный контент Base64 как строку, а затем записать его на HDD в виде двоичного содержимого в WSH

Я много часов боролся, чтобы узнать, что не так с моим кодом, но в целом, как только я напишу декодированный base64 на жесткий диск, я вижу разные байты между исходным файлом и закодированным - декодированным файл.

Я также использовал следующее site для шифрования, расшифровки строки Base64ed только для проверки правильности ввода/вывода.

var base64string = "base64 string"; 
function Base64Encode(str) { 
    if (/([^\u0000-\u00ff])/.test(str)) throw Error('String must be ASCII'); 

    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 
    var o1, o2, o3, bits, h1, h2, h3, h4, e=[], pad = '', c; 

    c = str.length % 3; // pad string to length of multiple of 3 
    if (c > 0) { while (c++ < 3) { pad += '='; str += '\0'; } } 
    // note: doing padding here saves us doing special-case packing for trailing 1 or 2 chars 

    for (c=0; c<str.length; c+=3) { // pack three octets into four hexets 
     o1 = str.charCodeAt(c); 
     o2 = str.charCodeAt(c+1); 
     o3 = str.charCodeAt(c+2); 

     bits = o1<<16 | o2<<8 | o3; 

     h1 = bits>>18 & 0x3f; 
     h2 = bits>>12 & 0x3f; 
     h3 = bits>>6 & 0x3f; 
     h4 = bits & 0x3f; 

     // use hextets to index into code string 
     e[c/3] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4); 
    } 
    str = e.join(''); // use Array.join() for better performance than repeated string appends 

    // replace 'A's from padded nulls with '='s 
    str = str.slice(0, str.length-pad.length) + pad; 

    return str; 
} 

function Base64Decode(str) { 
    if (!(/^[a-z0-9+/]+={0,2}$/i.test(str)) || str.length%4 != 0) throw Error('Not base64 string'); 

    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 
    var o1, o2, o3, h1, h2, h3, h4, bits, d=[]; 

    for (var c=0; c<str.length; c+=4) { // unpack four hexets into three octets 
     h1 = b64.indexOf(str.charAt(c)); 
     h2 = b64.indexOf(str.charAt(c+1)); 
     h3 = b64.indexOf(str.charAt(c+2)); 
     h4 = b64.indexOf(str.charAt(c+3)); 

     bits = h1<<18 | h2<<12 | h3<<6 | h4; 

     o1 = bits>>>16 & 0xff; 
     o2 = bits>>>8 & 0xff; 
     o3 = bits & 0xff; 

     d[c/4] = String.fromCharCode(o1, o2, o3); 
     // check for padding 
     if (h4 == 0x40) d[c/4] = String.fromCharCode(o1, o2); 
     if (h3 == 0x40) d[c/4] = String.fromCharCode(o1); 
    } 
    str = d.join(''); // use Array.join() for better performance than repeated string appends 

    return str; 
} 


var base64decoded= Base64Decode(base64string); 
var TextStream = WScript.CreateObject('ADODB.Stream'); 
TextStream.Type = 2; 
.,TextStream.charSet = 'windows-1250'; 
TextStream.Open(); 
TextStream.WriteText(base64decoded); 


var BinaryStream = WScript.CreateObject('ADODB.Stream'); 
BinaryStream.Type = 1; 
BinaryStream.Open(); 
TextStream.Position = 0; 
TextStream.CopyTo(BinaryStream); 
BinaryStream.SaveToFile("C:\\file.bin", 2); 
BinaryStream.Close(); 

Difference between the original file and the decoded string once flushed to the disk

ответ

0

Оказывается, я использовал неправильный Charset.

TextStream.charSet = 'iso-8859-1'; это правильный ответ.

Смежные вопросы