147 votes

Comment convertir un tableau uint8 en chaîne codée base64 ?

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 ?

0voto

Kamran Gasimov Points 81

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

-1voto

pascow Points 1

-1voto

lucss Points 49

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;
}

-3voto

Norguard Points 10718

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...

-5voto

mancini0 Points 31

npm install google-closure-library --save

require("google-closure-library");
goog.require('goog.crypt.base64');

var result =goog.crypt.base64.encodeByteArray(Uint8Array.of(1,83,27,99,102,66));
console.log(result);

$node index.js écrirait AVMbY2Y= à la console.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X