2015-02-13 24 views
6

Oto mój kod:Dlaczego na końcu mojego ciągu pojawia się znak nowej linii, kiedy kończę dekodowanie i kodowanie?

def hex_to_base64(hex_string): 
    clear = hex_string.decode("hex") 
    print(clear) 
    base64 = clear.encode("base64") 
    print(base64) 
    return base64 

hexstring = "49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d" 
result = hex_to_base64(hexstring) 

# verify results 
if result == 'SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t': 
    print("Yuuuup!!! %r" % result) 
else: 
    print("Nope! %r" % result) 

Moje wyniki testu weryfikacji zawodzi. Wydrukowany:

Nope! 'SSdtIGtpbGxpbmcgeW91ciBicmFpbiBsaWtlIGEgcG9pc29ub3VzIG11c2hyb29t\n' 

Skąd się bierze "\ n" znak nowej linii? Mógłbym go rozebrać, żeby przejść test, ale czuję, że to oszustwo.

Odpowiedz

8

kodowania base64 obejmuje go:

>>> 'a'.encode('base64') 
'YQ==\n' 

Inne metody kodowania base64 to również, że przełamane; zobacz base64.encode() na przykład:

encode() zwraca zakodowane dane plus tyłu znak nowej linii ('\n').

Wybór wydaje się być historycznym; Kodowanie zawartości MIME Base64 dyktuje, że używana jest maksymalna długość linii, a nowe linie są wstawiane w celu zachowania tej długości, ale RFC 3548 stwierdza, że ​​implementacje nie mogą.

Python oferuje obie opcje; Ci mógłby użyć base64.b64encode() function tutaj zamiast:

>>> import base64 
>>> base64.b64encode('a') 
'YQ==' 
+0

To jest dokładnie ta informacja, której szukałem. Dzięki. – quakkels

+0

Kodowanie zawartości MIME Base64 powoduje, że używana jest maksymalna długość linii, a nowe linie są wstawiane, aby zachować tę długość. Czy możesz wyjaśnić więcej? W jaki sposób końcowy znak nowej linii utrzymuje długość? – Codefor

+0

MIME dodatkowo wymusza długość linii składającą się z 76 znaków plus CRLF. kiedy łańcuch znaków jest wystarczająco duży (powiedzmy 100 bajtów), czy powinniśmy wstawić CRLF w środku ciągu wyjściowego, czy dodać tylko końcową CRLF? – Codefor

1

Jeśli szukasz sposobu, aby uzyskać zakodowany ciąg bez kończący znak nowej linii funkcja base64.b46encode zrobi. Oto różnica:

In [19]: base64.encodestring('a') 
Out[19]: 'YQ==\n' 

In [20]: base64.b64encode('a') 
Out[20]: 'YQ=='