J'ai une communication webSocket, je reçois une chaîne encodée en base64, je la convertis en uint8 et je travaille dessus, mais maintenant j'ai besoin de la renvoyer, j'ai le tableau uint8, et j'ai besoin de le convertir en chaîne base64, pour pouvoir l'envoyer. Comment puis-je faire cette conversion ?
Réponses
Trop de publicités?Une solution simple et compacte
base64 a uint8array
function base64ToUint8Array(base64String) {
var padding = '='.repeat((4 - base64String.length % 4) % 4);
var base64 = (base64String + padding)
.replace(/\-/g, '+')
.replace(/_/g, '/');
var rawData = window.atob(base64);
var outputArray = new Uint8Array(rawData.length);
for (var i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
uint8array a base64
const uint8ArrayToBase64 = async (data) => {
// Use a FileReader to generate a base64 data URI
const base64url = await new Promise((r) => {
const reader = new FileReader()
reader.onload = () => r(reader.result)
reader.readAsDataURL(new Blob([data]))
})
/*
The result looks like
"data:application/octet-stream;base64,<your base64 data>",
so we split off the beginning:
*/
return base64url.split(",", 2)[1]
}
Exemple :
base64ToUint8Array(await uint8ArrayToBase64(pdfBytes))
Voici une fonction JS à ce sujet :
Cette fonction est nécessaire parce que Chrome n'accepte pas une chaîne de caractères encodée en base64. comme valeur pour applicationServerKey dans pushManager.subscribe. https://bugs.chromium.org/p/chromium/issues/detail?id=802280
function urlBase64ToUint8Array(base64String) {
var padding = '='.repeat((4 - base64String.length % 4) % 4);
var base64 = (base64String + padding)
.replace(/\-/g, '+')
.replace(/_/g, '/');
var rawData = window.atob(base64);
var outputArray = new Uint8Array(rawData.length);
for (var i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
Si tout ce que vous voulez est une implémentation JS d'un encodeur base64, afin de pouvoir renvoyer des données, vous pouvez essayer la fonction btoa
fonction.
b64enc = btoa(uint);
Quelques remarques rapides sur btoa : il s'agit d'une norme non standard, les navigateurs ne sont donc pas obligés de la prendre en charge. Cependant, la plupart d'entre eux le font. Les plus grands, du moins. atob
est la conversion inverse.
Si vous avez besoin d'une implémentation différente, ou si vous trouvez un cas limite où le navigateur n'a aucune idée de ce dont vous parlez, la recherche d'un encodeur base64 pour JS ne sera pas trop difficile.
Je pense qu'il y en a 3 qui traînent sur le site web de mon entreprise, pour une raison quelconque...
- Réponses précédentes
- Plus de réponses