web-dev-qa-db-fra.com

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; il est stocké 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 base64 provenant d’un fichier, $z finit simplement comme quelque chose comme 䐲券.

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

En un mot, YmxhaGJsYWg= est dans un fichier texte puis mis dans une chaîne dans ce code Powershell et j'essaye de le décoder mais finis avec 䐲券 etc.

46
JBurace

Le codage prend-il le texte TO base64 et le décodage ne reprend-il pas base64 en texte? Vous semblez les mélanger ici. Quand je décode en utilisant ce décodeur en ligne je reçois:

BASE64: blahblah
UTF8: nVnV

pas l'inverse. Je ne peux cependant pas le reproduire complètement dans PS. Voir échantillon ci-dessous:

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

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

[~ # ~] modifier [~ # ~] Maintenant que vous avez posé la bonne question, je peux essayer d'y répondre. Je crois que vous utilisez le mauvais encodeur pour votre texte. La chaîne base64 codée est codée à partir de la 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
62
Frode F.

Le codage Base64 convertit trois octets de 8 bits (0 à 255) en quatre octets de 6 bits (0 à 63, également appelé base64). Chacun des quatre octets indexe une chaîne ASCII) qui représente la sortie finale sous forme de quatre caractères ASCII). La chaîne indexée est généralement 'A-Za- z0-9 +/'with' = 'utilisé comme bourrage C'est pour cette raison que les données codées sont plus longues de 4/3.

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

Bien que l'encodage en base64 puisse encoder du texte brut, son avantage réel est d'encoder des caractères non imprimables qui peuvent être interprétés par les systèmes émetteurs en tant que caractères de contrôle.

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

Base64decode ("la réponse à la vie de l'univers et de tout") = 00101010

4
cknox

Cette page apparaît lorsque vous google, comment convertir en base64, donc pour être complet:

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

Il n'y a aucune commande native à PowerShell pour la conversion Base64 - pour le moment (à partir de PowerShell Core 6.2.0), mais l'ajout d'applets de commande dédiées a été suggéré .
Pour le moment, l’utilisation directe de .NET est nécessaire.

Important :

  • encodage Base64 est un encodage de binaire données utilisant octets dont les valeurs sont contraintes à un caractère bien défini de 64 caractères sous-gamme du ASCII jeu de caractères représentant caractères imprimables =, conçu à un moment où l'envoi d'octets arbitraires était problématique, en particulier avec le bit de poids fort défini (valeurs d'octets> 0x7f).

  • Par conséquent, vous devez toujours spécifier explicitement quoi codage de caractères les octets Base64 doivent/devraient représenter .

Ergo:

  • lors de la conversion en TO Base64, vous devez d’abord obtenir une représentation byte de la chaîne que vous essayez d’encoder en utilisant le caractère encodant le consommateur de la chaîne Base64 attendue .

  • lors de la conversion de FROM Base64, vous devez interpréter le tableau d'octets résultant sous la forme d'une chaîne en utilisant le même codage que celui utilisé pour créer la représentation Base64.

Exemples:

Remarque:

  • Les exemples suivants convertissent vers et à partir de UTF-8 chaînes codées:

  • Pour convertir en UTF-16LE ("Unicode"), remplacez [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
3
mklement0

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

1
中野春子