如何将uint8数组转换为base64编码字符串?
2022-08-30 04:45:43
我得到了一个webSocket通信,我收到base64编码的字符串,将其转换为uint8并对其进行处理,但现在我需要发送回去,我得到了uint8数组,并且需要将其转换为base64字符串,以便我可以发送它。如何进行此转换?
我得到了一个webSocket通信,我收到base64编码的字符串,将其转换为uint8并对其进行处理,但现在我需要发送回去,我得到了uint8数组,并且需要将其转换为base64字符串,以便我可以发送它。如何进行此转换?
如果您的数据可能包含多字节序列(不是纯 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));
如果您使用的是 Node.js则可以使用此代码将 Uint8Array 转换为 base64
var u8 = new Uint8Array([65, 66, 67, 68]);
var b64 = Buffer.from(u8).toString('base64');