2016-06-21 11 views
2

Ich bin neu in Python und ich habe ein Problem, das mich stört.Python 3 und base64 Codierung einer Binärdatei

Ich verwende den folgenden Code, um eine Base64-String-Darstellung meiner Zip-Datei zu erhalten.

Nun, wenn ich die Zeichenfolge ausgeben, ist es in einer b '' Darstellung enthalten. Dies ist für mich nicht notwendig und ich möchte es vermeiden. Außerdem fügt es alle 76 Zeichen einen Zeilenumbruch hinzu, was ein weiteres Problem darstellt. Gibt es eine Möglichkeit, den binären Inhalt zu erhalten und ihn ohne die Newline-Zeichen und das nachfolgende und führende b '' darzustellen?

Nur zum Vergleich, wenn ich die folgenden in Powershell:

$fileName = "C:\Users\Mario\Downloads\exportTest1.zip" 
$fileContentBytes = [System.IO.File]::ReadAllBytes($fileName) 
$fileContentEncoded = [System.Convert]::ToBase64String($fileContentBytes) 

ich tun, um die genaue Zeichenfolge, die ich suche, ohne b ‚‘ und keine \ n jeweils 76 Zeichen.

+0

@PadraicCunningham so? Ist das nicht das, was beim Verwalten von Binärdateien zu tun ist? Haben Sie ein Beispiel dafür, wie man eine Binärdatei korrekt codiert und sie als Base64-String darstellt? –

+0

https://docs.python.org/3.5/library/base64.html#base64.encodebytes, wenn Sie keine Bytes wollen, müssen Sie –

Antwort

5

Vom base64 package doc:

base64.encodestring:

„Encode die Bytes artigen Gegenstand S, die beliebige binäre Daten enthalten kann, und das Rück bytes die Base64-kodierte Daten enthält, mit newlines (b"\n") eingefügt nach jeder 76 Bytes der Ausgabe, und sicherzustellen, dass es eine abschließende Newline, gemäß RFC 2045 (MIME). "

Sie wollen

base64.b64encode verwenden: "Encode die Bytes-ähnliches Objekt s mit Base64 und gibt die codierten bytes"

Beispiel:

import base64 

with open("test.zip", "rb") as f: 
    encodedZip = base64.b64encode(f.read()) 
    print(encodedZip.decode()) 

Die decode() konvertiert die binäre Zeichenfolge in Text.

+0

decodieren Dies löst das Problem mit \ n, aber ich sehe immer noch die führenden b 'Charakter. Sollte ich es einfach manuell mit [: -1] entfernen oder gibt es einen saubereren Weg? –

+0

@MarioMajcica Siehe meine Bearbeitung. –

+0

.decode() hat es geschafft! Danke –

3

Verwenden Sie b64encode, um ohne die Zeilenumbrüche zu codieren, und dekodieren Sie dann die resultierende binäre Zeichenfolge mit .decode('ascii'), um eine normale Zeichenfolge zu erhalten.

encodedZip = base64.b64encode(zipContents).decode('ascii')