为了账号安全,请及时绑定邮箱和手机立即绑定

NodeJs base64 字符串不正确

NodeJs base64 字符串不正确

哔哔one 2023-10-14 16:05:27
我正在尝试将 mp3 文件编码为 base64。我正在使用逐行读取文件createInterface,然后连接字符串。然后我使用 Base64 对字符串进行编码new Buffer(str).string('base64')编码的 base64 不正确,每行读取的 + 符号(假设)PHP base64 工作正常。The Node generated base64 SUQzAwAAAAZVbFRJVDIAAABOAAAATG92ZSBZb3UgVG9uaWdodCBmdC4gS2FiemEgRGUgU21hbGwsIERKIE1hcGhvcmlzYSAmIFNoYXNoYSB8IHd3dy5iZWF0emphbS5jb21UUEUxAAAAIwAAAFtCZWF0ekphbV1NRlIgU291bHMgfCBiZWF0emphbS5jb21UQUxCAAAAEQAAAHd3dy5iZWF0emphbS5jb21UWUVSAAAABQAAADIwMTlUQ09OAAAADgAAAFBlcmZlY3QgTXVzaWNDT01NAAAAJQAAAGVuZwBEb3dubG9hZGVkIEZyb20gd3d3LmJlYXR6amFtLmNvbUFQSUMAAXTvv70AAABpbWFnZS9qcGVnAABEb3dubG9hZGVkIEZyb20gd3d3LmJlYXR6amFtLmNvbQDvv73vv73vv73vv70AEEpGSUYAAQEAAAEAAQAA77+977+9AO+PHP base64SUQzAwAAAAZVbFRJVDIAAABOAAAATG92ZSBZb3UgVG9uaWdodCBmdC4gS2FiemEgRGUgU21hbGwsIERKIE1hcGhvcmlzYSAmIFNoYXNoYSB8IHD3dy5iZWF0emphbS5jb21UUEUxAAAAIwAAAFtCZWF0ekph bV1NRligU2 91bHMgfCBiZWF0emphbS5jb21UQUxCAAAAEQAAAHd3dy5iZWF0emphbS5jb21UWUVSAAAABQAAADIwMTLUQ09OAAAADgAAAFBlcmZlY3QgTXVzaWNDT01NAAAAJQAAAGVuZwBEb3dubG9h ZGVkIEZyb20gd3d3LmJlYXR 6amFtLmNvbUFQSUMAAXTDAAAAaW1hZ2UvanBlZwAARG93bmxvYWRlZCBGcm9tIHd3dy5iZWF0emphbS5jb20A/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAYGBgYHB gcICackCwoLCg8ODAwODxYQERAREBYiFRkVFRkVIh4k HhweJB42KiYmKjY+NDI0PkxERExfWl98fKcBBgYGBgcGBwgIBwoLCgsKDw4MDA4PFHAREBEQFiIVGRUVGRUiHiQeHB4kHjYqJiYqNj40MjQ+TERET F9aX3x8p//CABEIBAAEAAMBIGACEQEDEQH/xAAxAEAAwEBAQAAAAAAA AAAAAAAQIDBAUGAQEAAAAAAAAAAAAAQIDBAX/2gAMAwEAAhADEAAAAvZmJ++fu4e2envx2xWHQjweyl+2fTJ5WPJ9fy+k5Pc871bCWUth 0VEps+W+j8b1+jeZYnm49OfR6UykjyPY8fb0ejz/AENRzdLTxPb4PQIi0R4 vf5vrZuqWEeZ18x6KWVfC9zxbfann6Yjg9DiPG9/m61vFowhhusJZeT2cnXpumOeuXz这是示例代码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>` )   })
查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

也许使用Buffer.from(str).toString('base64')



查看完整回答
反对 回复 2023-10-14
?
慕后森

TA贡献1802条经验 获得超5个赞

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

atob()btoa()函数(在客户端)。

查看完整回答
反对 回复 2023-10-14
?
三国纷争

TA贡献1804条经验 获得超7个赞

readLine.createInterface和 的组合fs.createReadStream没有多大意义,因为已经触发了和等createReadStream事件。dataerrorend

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

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

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

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

收到的data是a 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");

});


查看完整回答
反对 回复 2023-10-14
  • 3 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信