【问题标题】:NodeJs base64 string incorrectNodeJs base64 字符串不正确
【发布时间】:2023-03-12 17:30:02
【问题描述】:

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

然后我使用new Buffer(str).string('base64')对字符串进行base64编码

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

PHP base64 工作正常。

Node生成base64 SUQzAwAAAAZVbFRJVDIAAABOAAAATG92ZSBZb3UgVG9uaWdodCBmdC4gS2FiemEgRGUgU21hbGwsIERKIE1hcGhvcmlzYSAmIFNoYXNoYSB8IHd3dy5iZWF0emphbS5jb21UUEUxAAAAIwAAAFtCZWF0ekphbV1NRlIgU291bHMgfCBiZWF0emphbS5jb21UQUxCAAAAEQAAAHd3dy5iZWF0emphbS5jb21UWUVSAAAABQAAADIwMTlUQ09OAAAADgAAAFBlcmZlY3QgTXVzaWNDT01NAAAAJQAAAGVuZwBEb3dubG9hZGVkIEZyb20gd3d3LmJlYXR6amFtLmNvbUFQSUMAAXTvv70AAABpbWFnZS9qcGVnAABEb3dubG9hZGVkIEZyb20gd3d3LmJlYXR6amFtLmNvbQDvv73vv73vv73vv70AEEpGSUYAAQEAAAEAAQAA77 + 977 + + 9AO P>

PHP base64

SUQzAwAAAAZVbFRJVDIAAABOAAAATG92ZSBZb3UgVG9uaWdodCBmdC4gS2FiemEgRGUgU21hbGwsIERKIE1hcGhvcmlzYSAmIFNoYXNoYSB8IHd3dy5iZWF0emphbS5jb21UUEUxAAAAIwAAAFtCZWF0ekphbV1NRlIgU291bHMgfCBiZWF0emphbS5jb21UQUxCAAAAEQAAAHd3dy5iZWF0emphbS5jb21UWUVSAAAABQAAADIwMTlUQ09OAAAADgAAAFBlcmZlY3QgTXVzaWNDT01NAAAAJQAAAGVuZwBEb3dubG9hZGVkIEZyb20gd3d3LmJlYXR6amFtLmNvbUFQSUMAAXTDAAAAaW1hZ2UvanBlZwAARG93bmxvYWRlZCBGcm9tIHd3dy5iZWF0emphbS5jb20A / 9J / 4AAQSkZJRgABAQAAAQABAAD / 2wCEAAYGBgYHBgcICAcKCwoLCg8ODAwODxYQERAREBYiFRkVFRkVIh4kHhweJB42KiYmKjY + NDI0PkxERExfWl98fKcBBgYGBgcGBwgIBwoLCgsKDw4MDA4PFhAREBEQFiIVGRUVGRUiHiQeHB4kHjYqJiYqNj40MjQ + TERETF9aX3x8p // CABEIBAAEAAMBIgACEQEDEQH / xAAxAAEAAwEBAQAAAAAAAAAAAAAAAQIDBAUGAQEBAQEBAQAAAAAAAAAAAAAAAQIDBAX / 2gAMAwEAAhADEAAAAvZmJ + H6wAoAAKTEgAIFAAEiJCCsWkoAAEAJAUEAEkiQAAAAEkJEJEJEJEAAAhIhIgKAAiRCYAAAUACEiEiAAAABKiRAAgAIARMEgACgApIBYAAASqEgAIACgARIAAACZIkABJCQAACABAUAAACwkQkQABEiEiBQLCRAgAFACgESISITEAAAIlLAAgAIAACgAElBYBIoAAAAAEiLVzbDUASAAACRAgkAAgAmISIkAAAAAESITFAAAoEJgCkSITACgImAAAAFA AAAAgAQEsACAAgKAAJUFiYmgAAQLQAkAJEJEJAAAAEhAEgEgBIAEpCQAAJITAAAiRCRCYAWEiABbCRAAITACgIkQkQkQmAAALQkBQESIEQlLAgAAABMTQWJKCwkQlUJESCJEJQAAAAAJSJAIEgIASgAkgAkiRCVQkQmaqsKpRCYAiElhMAEJEBYSITFAsJEARKoTACgAAQkQkQlUJEJEJECVEogQiYlCAAAqRYSoLElAAAAAAAABISAAoSBIJISCSQkRMohM2VmREpSEzpCZ1ITO1VmpVZVVowqtGLVZi0WRVYtYsKrIqsqqS1WghIqtCwkREqhJYAiRAAAUAAAABEiBCJSwIhMShAEjUJUFiSkmoATAEAAAAACTz + fu4e2envx2xWHQjweyl + 2fTJ5WPJ9fy + k5Pc871bCWUTh0VEps + W + j8b1 + jeZYnm49OfR6UykjyPY8fb0ejz / AENRzdLTxPb4PQIi0R4vf5vrZuqWEeZ18x6KWVfC9zxbfann6Yjg9DiPG9 / m61vFowhhusJZeT2cnXpumOeuXz P>

这是一个示例代码

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>` )
   
})

【问题讨论】:

  • 感谢您对下面我的回答的反馈。它对你有用吗?如果有任何不清楚的地方,请随时询问。如果它回答了您的问题,请考虑通过单击左侧的复选标记来接受它。

标签: javascript node.js encoding base64


【解决方案1】:

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

【讨论】:

  • 不走运。似乎节点在每一行末尾都放置了一些字符
【解决方案2】:

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

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

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

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

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

收到的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");
});

【讨论】:

    【解决方案3】:

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

    atob()btoa() 函数(在客户端)。 这是docs

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 1970-01-01
      • 2019-03-20
      • 2021-06-30
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多