Я пытаюсь преобразовать следующий код из php в javascript:
echo base64_encode(gzencode( file_get_contents("image.png") ));
Моя версия javascript приведенного выше кода выглядит следующим образом:
var zlib = require('zlib');
var xhr = new XMLHttpRequest();
xhr.open( "GET", "http://localhost:3000/image.png", true );
xhr.responseType = "arraybuffer";
xhr.onload = function( e ) {
var arrayBufferView = new Uint8Array( this.response );
var blob = new Blob( [ arrayBufferView ], { type: "image/png" } );
var reader = new FileReader();
reader.onloadend = function () {
var blobStr = reader.result;
zlib.gzip(blobStr, function(err, buf) {
var b64 = new Buffer(buf).toString('base64');
console.log(b64);
});
}
reader.readAsBinaryString(blob);
};
xhr.send();
Я запрашиваю файли преобразовать его в BLOB-объект типа PNG.Затем я использую FileReader для чтения файла в виде двоичной строки.Затем я gzip эту двоичную строку, а затем base64 кодировать ее.Мой окончательный вывод заканчивается в переменной b64.
Однако этот вывод в конечном итоге отличается от вывода php.
Игра в консоли Chrome заставляет меня чувствовать, что это может быть проблема с форматированием двоичной строки, поскольку я не могу скопировать всю строку из консоли.
Также я чувствую, что могут быть различия в двух gzips, поскольку echo base64_encode(gzencode( "test" ));
возвращает
H4sIAAAAAAAACytJLS4BAAx + f9gEAAAA
между тем
var zlib = require('zlib');
zlib.gzip("test", function(err, buf) {
var b64 = new Buffer(buf).toString('base64');
console.log(b64);
});
возвращает
H4sIAAAAAAAAAytJLS4BAAx + f9gEAAAA
, обратите внимание, что строки почти идентичны, за исключением "C" вместо "A" в качестве 13-го символа.Не уверен, что этого достаточно для того, чтобы все испортить в реальных данных файла изображения.
Есть идеи, как сделать так, чтобы версия javascript имела тот же результат, что и версия php?На каком этапе дела идут плохо?Мне действительно нужно, чтобы они имели одинаковый вывод, потому что сторонняя библиотека читает строки, созданные в версии php.