84 votes

Comment décoder une chaîne Base64 ?

J'ai une chaîne normale dans Powershell qui provient d'un fichier texte contenant du texte Base64 ; elle est stockée dans $x . J'essaie de le décoder comme tel :

$z = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($x));

Cela fonctionne si $x était une chaîne Base64 créée dans Powershell (mais ce n'est pas le cas). Et cela ne fonctionne pas sur le $x Chaîne de caractères Base64 provenant d'un fichier, $z aboutit simplement à quelque chose comme .

Qu'est-ce qui me manque ? Par exemple, $x pourrait être YmxhaGJsYWg= qui est Base64 pour blahblah .

En bref, YmxhaGJsYWg= est dans un fichier texte, puis mis dans une chaîne dans ce code Powershell et j'essaie de le décoder, mais je me retrouve avec etc.

123voto

Frode F. Points 12953

L'encodage n'est-il pas le passage du texte à la base64 et le décodage le retour de la base64 au texte ? Vous semblez les mélanger ici. Lorsque je décode en utilisant ce décodeur en ligne Je reçois :

BASE64: blahblah
UTF8: nVnV

et non l'inverse. Je n'arrive pas à le reproduire complètement dans PS. Voir l'exemple ci-dessous :

PS > [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("blahblah"))
nVnV

PS > [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("nVnV"))
blZuVg==

EDIT Je crois que vous n'utilisez pas le bon codeur pour votre texte. La chaîne encodée base64 est encodée à partir d'une chaîne UTF8 (ou ASCII).

PS > [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("YmxhaGJsYWg="))
blahblah

PS > [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String("YmxhaGJsYWg="))

PS > [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String("YmxhaGJsYWg="))
blahblah

34voto

mklement0 Points 12597

Il y a non Commandes PowerShell pour la conversion Base64 - encore (à partir de PowerShell [Core] 7.1), mais l'ajout de cmdlets dédiés a été suggéré en Problème GitHub #8620 .
Pour l'instant, l'utilisation directe de .NET est nécessaire.

Important :

  • Encodage Base64 est un encodage de binaire données en utilisant octets dont les valeurs sont limitées à un nombre bien défini de 64 caractères. sous-gamme du jeu de caractères ASCII représentant caractères imprimables Le système de gestion des octets a été conçu à une époque où l'envoi d'octets arbitraires posait des problèmes, en particulier lorsque le bit de poids fort était activé (valeurs d'octets > 0x7f).

  • C'est pourquoi, vous devez toujours spécifier explicitement ce que codage des caractères les octets Base64 représentent / devraient représenter .

Par conséquent :

  • sur Conversion en Base64 vous devez d'abord obtenir un représentation en octets de la chaîne que vous essayez d'encoder en utilisant l'encodage de caractères que l'option consommateur de la chaîne Base64 attendue.

  • sur conversion de Base64 vous devez interpréter le tableau d'octets résultant comme une chaîne de caractères en utilisant le même encodage que celui utilisé pour créer la représentation Base64 .

Exemples :

Remarque :

  • Les exemples suivants permettent d'effectuer des conversions de et vers UTF-8 des chaînes de caractères codées :

  • Pour convertir de et vers UTF-16LE ("Unicode") à la place, substituer [Text.Encoding]::Unicode pour [Text.Encoding]::UTF8

Convertir en Base64 :

PS> [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes('Motörhead'))
TW90w7ZyaGVhZA==

Convertir à partir de Base64 :

PS> [Text.Encoding]::Utf8.GetString([Convert]::FromBase64String('TW90w7ZyaGVhZA=='))
Motörhead

8voto

KERR Points 358

Cette page apparaît lorsque l'on cherche sur Google comment convertir en base64, par souci d'exhaustivité :

$b  = [System.Text.Encoding]::UTF8.GetBytes("blahblah")
[System.Convert]::ToBase64String($b)

5voto

cknox Points 51

L'encodage Base64 convertit trois octets de 8 bits (0-255) en quatre octets de 6 bits (0-63 alias base64). Chacun des quatre octets indexe une chaîne ASCII qui représente la sortie finale sous la forme de quatre caractères ASCII de 8 bits. La chaîne indexée est généralement 'A-Za-z0-9+/' avec '=' utilisé comme remplissage. C'est pourquoi les données encodées sont 4/3 plus longues.

Le décodage Base64 est le processus inverse. Et comme on peut s'y attendre, les données décodées sont 3/4 plus longues.

Bien que le codage base64 puisse coder du texte en clair, son véritable avantage est de coder des caractères non imprimables qui peuvent être interprétés par les systèmes de transmission comme des caractères de contrôle.

Je suggère que l'auteur de l'affiche originale rende $z sous forme d'octets, chaque bit ayant une signification pour l'application. Le rendu des caractères non imprimables en tant que texte invoque généralement Unicode qui produit des glyphes basés sur la localisation de votre système.

Base64decode("the answer to life the universe and everything") = 00101010

4voto

中野春子 Points 43

J'ai eu des problèmes avec des espaces qui apparaissaient entre mes sorties et il n'y avait pas de réponse en ligne pour résoudre ce problème. J'ai littéralement passé plusieurs heures à essayer de trouver une solution et j'en ai trouvé une en jouant avec le code au point que je ne savais même pas ce que j'avais tapé au moment où j'ai réussi à le faire fonctionner. Voici la solution que j'ai trouvée : [System.Text.Encoding]::UTF8.GetString(([System.Convert]::FromBase64String($base64string)|?{$_}))

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