Javascript NodeJs base64字符串不正确
我正在尝试将mp3文件编码为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
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在每行末尾都放置了一些字符,我希望您能对我下面的答案给出反馈。对你有用吗?如果有什么不清楚的地方,尽管问。如果它回答了你的问题,考虑通过点击左边的勾选来接受它。