[英]NodeJs base64 string incorrect
I'm trying to encode an mp3 file to base64.我正在尝试将 mp3 文件编码为 base64。 I'm reading file line by line using createInterface
and then concatenate the strings.我正在使用createInterface
逐行读取文件,然后连接字符串。
I then base64 encode the string using new Buffer(str).string('base64')
然后我 base64 使用new Buffer(str).string('base64')
对字符串进行编码
The encoded base64 is incorrect with + signs at every line read (assumption)编码的 base64 不正确,每行读取的 + 符号(假设)
PHP base64 is working fine. PHP base64 工作正常。
The Node generated base64 SUQzAwAAAAZVbFRJVDIAAABOAAAATG92ZSBZb3UgVG9uaWdodCBmdC4gS2FiemEgRGUgU21hbGwsIERKIE1hcGhvcmlzYSAmIFNoYXNoYSB8IHd3dy5iZWF0emphbS5jb21UUEUxAAAAIwAAAFtCZWF0ekphbV1NRlIgU291bHMgfCBiZWF0emphbS5jb21UQUxCAAAAEQAAAHd3dy5iZWF0emphbS5jb21UWUVSAAAABQAAADIwMTlUQ09OAAAADgAAAFBlcmZlY3QgTXVzaWNDT01NAAAAJQAAAGVuZwBEb3dubG9hZGVkIEZyb20gd3d3LmJlYXR6amFtLmNvbUFQSUMAAXTvv70AAABpbWFnZS9qcGVnAABEb3dubG9hZGVkIEZyb20gd3d3LmJlYXR6amFtLmNvbQDvv73vv73vv73vv70AEEpGSUYAAQEAAAEAAQAA77+977+9AO+ The Node generated base64 SUQzAwAAAAZVbFRJVDIAAABOAAAATG92ZSBZb3UgVG9uaWdodCBmdC4gS2FiemEgRGUgU21hbGwsIERKIE1hcGhvcmlzYSAmIFNoYXNoYSB8IHd3dy5iZWF0emphbS5jb21UUEUxAAAAIwAAAFtCZWF0ekphbV1NRlIgU291bHMgfCBiZWF0emphbS5jb21UQUxCAAAAEQAAAHd3dy5iZWF0emphbS5jb21UWUVSAAAABQAAADIwMTlUQ09OAAAADgAAAFBlcmZlY3QgTXVzaWNDT01NAAAAJQAAAGVuZwBEb3dubG9hZGVkIEZyb20gd3d3LmJlYXR6amFtLmNvbUFQSUMAAXTvv70AAABpbWFnZS9qcGVnAABEb3dubG9hZGVkIEZyb20gd3d3LmJlYXR6amFtLmNvbQDvv73vv73vv73vv70AEEpGSUYAAQEAAAEAAQAA77+977+9AO+
PHP base64 PHP base64
SUQzAwAAAAZVbFRJVDIAAABOAAAATG92ZSBZb3UgVG9uaWdodCBmdC4gS2FiemEgRGUgU21hbGwsIERKIE1hcGhvcmlzYSAmIFNoYXNoYSB8IHd3dy5iZWF0emphbS5jb21UUEUxAAAAIwAAAFtCZWF0ekphbV1NRlIgU291bHMgfCBiZWF0emphbS5jb21UQUxCAAAAEQAAAHd3dy5iZWF0emphbS5jb21UWUVSAAAABQAAADIwMTlUQ09OAAAADgAAAFBlcmZlY3QgTXVzaWNDT01NAAAAJQAAAGVuZwBEb3dubG9hZGVkIEZyb20gd3d3LmJlYXR6amFtLmNvbUFQSUMAAXTDAAAAaW1hZ2UvanBlZwAARG93bmxvYWRlZCBGcm9tIHd3dy5iZWF0emphbS5jb20A/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAYGBgYHBgcICAcKCwoLCg8ODAwODxYQERAREBYiFRkVFRkVIh4kHhweJB42KiYmKjY+NDI0PkxERExfWl98fKcBBgYGBgcGBwgIBwoLCgsKDw4MDA4PFhAREBEQFiIVGRUVGRUiHiQeHB4kHjYqJiYqNj40MjQ+TERETF9aX3x8p//CABEIBAAEAAMBIgACEQEDEQH/xAAxAAEAAwEBAQAAAAAAAAAAAAAAAQIDBAUGAQEBAQEBAQAAAAAAAAAAAAAAAQIDBAX/2gAMAwEAAhADEAAAAvZmJ++fu4e2envx2xWHQjweyl+2fTJ5WPJ9fy+k5Pc871bCWUTh0VEps+W+j8b1+jeZYnm49OfR6UykjyPY8fb0ejz/AENRzdLTxPb4PQIi0R4vf5vrZuqWEeZ18x6KWVfC9zxbfann6Yjg9DiPG9/m61vFowhhusJZeT2cnXpumOeuXz SUQzAwAAAAZVbFRJVDIAAABOAAAATG92ZSBZb3UgVG9uaWdodCBmdC4gS2FiemEgRGUgU21hbGwsIERKIE1hcGhvcmlzYSAmIFNoYXNoYSB8IHd3dy5iZWF0emphbS5jb21UUEUxAAAAIwAAAFtCZWF0ekphbV1NRlIgU291bHMgfCBiZWF0emphbS5jb21UQUxCAAAAEQAAAHd3dy5iZWF0emphbS5jb21UWUVSAAAABQAAADIwMTlUQ09OAAAADgAAAFBlcmZlY3QgTXVzaWNDT01NAAAAJQAAAGVuZwBEb3dubG9hZGVkIEZyb20gd3d3LmJlYXR6amFtLmNvbUFQSUMAAXTDAAAAaW1hZ2UvanBlZwAARG93bmxvYWRlZCBGcm9tIHd3dy5iZWF0emphbS5jb20A/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAYGBgYHBgcICAcKCwoLCg8ODAwODxYQERAREBYiFRkVFRkVIh4kHhweJB42KiYmKjY+NDI0PkxERExfWl98fKcBBgYGBgcGBwgIBwoLCgsKDw4MDA4PFhAREBEQFiIVGRUVGRUiHiQeHB4kHjYqJiYqNj40MjQ+TERETF9aX3x8p//CABEIBAAEAAMBIgACEQEDEQH/xAAxAAEAAwEBAQAAAAAAAAAAAAAAAQIDBAUGAQEBAQEBAQAAAAAAAAAAAAAAAQIDBAX/2gAMAwEAAhADEAAAAvZmJ++fu4e2envx2xWHQjweyl+2fTJ5WPJ9fy+k5Pc871bCWUTh0VEps+W+j8b1+jeZYnm49OfR6UykjyPY8fb0ejz/AENRzdLTxPb4PQIi0R4vf5vrZuqWEeZ18x6KWVfC9zxbfann6Yjg9DiPG9/m61vFowhhusJZeT2cnXpumOeuXz
Here is a sample code这是一个示例代码
var interface = readline.createInterface({
input: fs.createReadStream(file)
}),
str = '';
interface.on('line', (line)=>{
str += line;
} )
interface.on('close',()=>{
var base = new Buffer.from(str).toString('base64');
res.send( `<audio autoplay controls><source src="data:audio/mp3;base64,${base}"></source></audio>` )
})
perhaps use Buffer.from(str).toString('base64')
也许使用Buffer.from(str).toString('base64')
The combination of readLine.createInterface
and fs.createReadStream
doesn't make much sense, as createReadStream
already fires events like data
, error
and end
. readLine.createInterface
和fs.createReadStream
的组合没有多大意义,因为createReadStream
已经触发了data
、 error
和end
等事件。
The problem is also that you read by line
, but that's not how you could read a binary file.问题还在于您按line
阅读,但这不是您阅读二进制文件的方式。 How would you define a line in a binary (here.mp3) file?您将如何在二进制 (here.mp3) 文件中定义一行? The code seems to read chunks of data of different size (whatever it considers a line), and appends a string.该代码似乎读取了不同大小的数据块(无论它认为是一行),并附加了一个字符串。 Probably the byte that is interpreted as line end gets lost.可能被解释为行尾的字节丢失了。
And lastly, you would also get in trouble when the files is very large, because you add everything to a string and then create a buffer from it and output it at once.最后,当文件非常大时,您也会遇到麻烦,因为您将所有内容添加到字符串中,然后从中创建一个缓冲区,并立即创建 output 它。 So it would require more than 3 times the size of your mp3 file in memory.因此,它需要 memory 中 mp3 文件大小的 3 倍以上。
The solution below only uses fs.createReadStream
and limits the size of a chunk to 60.000 bytes by setting the {highWaterMark: 60000}
.下面的解决方案仅使用fs.createReadStream
并通过设置{highWaterMark: 60000}
将块的大小限制为 60.000 字节。
Note: the default size is 65536, but that would not work for the following base64 encoding.注意:默认大小为 65536,但这不适用于以下 base64 编码。 The data size must be a multiple of 3 !数据大小必须是3 的倍数!
The received data
is a buffer
, which can be converted to base64
directly.接收到的data
是一个buffer
,可以直接转换成base64
。
const fs = require('fs');
var file = "test.mp3";
let stream = fs.createReadStream(file, {highWaterMark : 60000});
stream.on('data', (data) => {
console.log("data length " + data.length)
var base = data.toString('base64');
fs.appendFile('test.b64', base, function (err,data) {
if (err) {
return console.log(err);
}
console.log("wrote " + base.length + " bytes");
})
}).on('error', err => {
console.log(err);
}).on('end', () => {
console.log("success");
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.