如何将uint8数组转换为base64编码string?
我得到了一个webSocket通讯,我收到base64编码的string,将其转换为uint8并在其上工作,但现在我需要发回,我得到了uint8数组,并需要将其转换为base64string,所以我可以发送它。 我怎样才能做这个转换?
如果您的浏览器具有TextDecoder,那么使用:
var u8 = new Uint8Array([65, 66, 67, 68]); var decoder = new TextDecoder('utf8'); var b64encoded = btoa(decoder.decode(u8));
如果您需要支持没有TextDecoder的浏览器 (当前只是IE和Edge),那么最好的select是使用TextDecoder填充 。
如果你的string是纯ASCII而不是多字节的Unicode / UTF-8,那么使用String.fromCharCode是一个简单的select,它应该得到相当普遍的支持:
var u8 = new Uint8Array([65, 66, 67, 68]); var b64encoded = btoa(String.fromCharCode.apply(null, u8));
并将base64string解码回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));
function Uint8ToBase64(u8Arr){ var CHUNK_SIZE = 0x8000; //arbitrary number var index = 0; var length = u8Arr.length; var result = ''; var slice; while (index < length) { slice = u8Arr.subarray(index, Math.min(index + CHUNK_SIZE, length)); result += String.fromCharCode.apply(null, slice); index += CHUNK_SIZE; } return btoa(result); }
如果你有一个非常大的Uint8Array,你可以使用这个函数。 这是为了Javascript,在FileReader readAsArrayBuffer的情况下可以是有用的。
非常简单的解决scheme和JavaScript的testing!
ToBase64 = function (u8) { return btoa(String.fromCharCode.apply(null, u8)); } FromBase64 = function (str) { return atob(str).split('').map(function (c) { return c.charCodeAt(0); }); } var u8 = new Uint8Array(256); for (var i = 0; i < 256; i++) u8[i] = i; var b64 = ToBase64(u8); console.debug(b64); console.debug(FromBase64(b64));
(用Unicode支持将Base64string解码为Uint8Array或ArrayBuffer)
如果你想要的只是一个base64编码器的JS实现,所以你可以发回数据,你可以尝试btoa
函数。
b64enc = btoa(uint);
关于btoa的一些快速注释 – 这是非标准的,所以浏览器不会被迫支持它。 但是,大多数浏览器都这样做。 最重要的是 atob
是相反的转换。
如果你需要一个不同的实现,或者你发现一个浏览器不知道你在说什么的边缘情况,寻找一个JS的base64编码器不会太难。
我认为他们有三个挂在我公司的网站上,出于某种原因…