如何将uint8数组转换为base64编码字符串?

2022-08-30 04:45:43

我得到了一个webSocket通信,我收到base64编码的字符串,将其转换为uint8并对其进行处理,但现在我需要发送回去,我得到了uint8数组,并且需要将其转换为base64字符串,以便我可以发送它。如何进行此转换?


答案 1

如果您的数据可能包含多字节序列(不是纯 ASCII 序列),并且您的浏览器具有 TextDecoder,则应使用它来解码数据(指定 TextDecoder 所需的编码):

var u8 = new Uint8Array([65, 66, 67, 68]);
var decoder = new TextDecoder('utf8');
var b64encoded = btoa(decoder.decode(u8));

如果您需要支持没有TextDecoder的浏览器(目前只有IE和Edge),那么最好的选择是使用TextDecoder polyfill

如果您的数据包含纯 ASCII(不是多字节 Unicode/UTF-8),那么有一种简单的替代方法应该得到普遍支持:String.fromCharCode

var ascii = new Uint8Array([65, 66, 67, 68]);
var b64encoded = btoa(String.fromCharCode.apply(null, ascii));

并将 base64 字符串解码回 Uint8Array:

var u8_2 = new Uint8Array(atob(b64encoded).split("").map(function(c) {
    return c.charCodeAt(0); }));

如果您有非常大的数组缓冲区,则应用可能会失败,您可能需要对缓冲区进行分块(基于@RohitSengar发布的缓冲区)。同样,请注意,仅当缓冲区仅包含非多字节 ASCII 字符时,这才是正确的:

function Uint8ToString(u8a){
  var CHUNK_SZ = 0x8000;
  var c = [];
  for (var i=0; i < u8a.length; i+=CHUNK_SZ) {
    c.push(String.fromCharCode.apply(null, u8a.subarray(i, i+CHUNK_SZ)));
  }
  return c.join("");
}
// Usage
var u8 = new Uint8Array([65, 66, 67, 68]);
var b64encoded = btoa(Uint8ToString(u8));

答案 2

如果您使用的是 Node.js则可以使用此代码将 Uint8Array 转换为 base64

var u8 = new Uint8Array([65, 66, 67, 68]);
var b64 = Buffer.from(u8).toString('base64');