Javascript NodeJs base64字符串不正确

Javascript NodeJs base64字符串不正确,javascript,node.js,encoding,base64,Javascript,Node.js,Encoding,Base64,我正在尝试将mp3文件编码为base64。我使用createInterface逐行读取文件,然后连接字符串 然后我使用newbuffer(str).string('base64') 编码的base64不正确,每读取一行都有+符号(假设) PHPBase64运行良好 节点生成base64 Suqzawaaaazvbfrjvdiabaaaaaatg92zsbzb3ugvg9uawdodcbmdc4g2fiemergugu21hbgwsierkie1hcghvcmlzymifnoyxb8izwf0em

我正在尝试将mp3文件编码为base64。我使用
createInterface
逐行读取文件,然后连接字符串

然后我使用
newbuffer(str).string('base64')

编码的base64不正确,每读取一行都有+符号(假设)

PHPBase64运行良好

节点生成base64 Suqzawaaaazvbfrjvdiabaaaaaatg92zsbzb3ugvg9uawdodcbmdc4g2fiemergugu21hbgwsierkie1hcghvcmlzymifnoyxb8izwf0emphbs5jb21uueuxaaaaiwaaftczwf0ekphbv1nriguu291bhmgfczbzbzbwf0emphbc2w0empzwf5jbzwf5hzwf5wf5jb0wwwf5w2uw2uwwwwbaaqw2w2ww2w2w2w2w2w2w2w2w2w2w7bqw2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2w2wXTVV70AAABPBWFNZS9QCGVNAABEB3DUBG9HZGVKIEZYB20GD3D3LMJLYXR6AMFTLMNVBQDV73VV73VV73VV70AEEPGSUYAAQEAQEAA77+977+9AO+

PHP base64

Suqzawaaaazvbfrjvdiabaaaaaatg92zsbzb3ugvg9uawdodcbmdc4g2fiemergugu21hbgwsierkie1hCGHcmlzymlzymifnoyxB8ihdyzwf0empHbS5jb21uueuxaaaaiwaaftczwf0ekphbv1nrigu291bHbMgfcbizwf0EmpHbHbHbHbHbHbHbHbHbWf5izwbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbHbMaaxtdaaaAaAaAaAaAaAaAaAaAaAaAaAaAaAaAaHz2UvAngAaAaAaAaAaAaAaAaAaAaAaAaAyGyGyGyGyGbGcWcWc8OdXvyWrLzCbgCbGcCc9TiHd3DyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyDyAaaaaaaaaaaaaaaaaaaaaaaaaaavavzmj+H6waoakakaiefaaeijccswkoaaaaajaajaajaajaajaajaahighkaaircyaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaajaGBIAEPCQQQKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKQKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKl+2fTJ5WPJ9fy+k5Pc871bCWUTh0VEps+W+j8b1+JEZYNM49Of6UYKJYPY8FB0EJZ/AENRzdLTxPb4PQIi0R4vf5vrZuqWEeZ18x6KWVfC9zxbfann6Yjg9DiPG9/M61VFOWHHUSJZET2NxPumoUXZ

这是一个示例代码

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>` )
   
})
var interface=readline.createInterface({
输入:fs.createReadStream(文件)
}),
str='';
接口.on('行',(行)=>{
str+=直线;
} )
接口.on('close',()=>{
var base=new Buffer.from(str).toString('base64');
res.send(``)
})

也许使用
Buffer.from(str).toString('base64')
readLine.createInterface
fs.createReadStream
的组合没有多大意义,因为
createReadStream
已经触发了
data
error
end
等事件

问题还在于您通过
读取,但这不是读取二进制文件的方式。如何在二进制文件(here.mp3)中定义一行?代码似乎读取不同大小的数据块(不管它认为是哪一行),并附加一个字符串。可能被解释为行结束的字节丢失了

最后,当文件非常大时,您也会遇到麻烦,因为您将所有内容添加到字符串中,然后从中创建缓冲区并立即输出。因此,它需要的内存大小是mp3文件的3倍以上

下面的解决方案仅使用
fs.createReadStream
,并通过设置
{highWaterMark:60000}
将块大小限制为60.000字节

注意:默认大小为65536,但这不适用于以下base64编码。数据大小必须为

接收到的
数据
是一个
缓冲区
,可以直接转换为
base64

const fs=require('fs');
var file=“test.mp3”;
让stream=fs.createReadStream(文件,{highWaterMark:60000});
stream.on('data',(data)=>{
console.log(“数据长度”+数据长度)
var base=data.toString('base64');
fs.appendFile('test.b64',base,function(err,data){
如果(错误){
返回console.log(err);
}
log(“写入”+base.length+“字节”);
})  
}).on('error',err=>{
控制台日志(err);
}).on('end',()=>{
控制台日志(“成功”);
});

尝试:
const encoded=Buffer.from(stringValue,'base64').toString()

或者
atob()
btoa()
函数(在客户端)。
这是答案。

运气不好。似乎node在每行末尾都放置了一些字符,我希望您能对我下面的答案给出反馈。对你有用吗?如果有什么不清楚的地方,尽管问。如果它回答了你的问题,考虑通过点击左边的勾选来接受它。