2015-03-19 38 views
5

Mam ciąg znaków ASCII = "abcdefghijk". Chcę napisać to do pliku binarnego w formacie binarnym przy użyciu Pythona.Zapisywanie łańcucha ASCII jako pliku binarnego w pythonie

Próbowałem następujące:

str = "abcdefghijk" 
fp = file("test.bin", "wb") 
hexStr = "".join((("\\x%s") % (x.encode("hex"))) for x in str) 
fp.write(hexStr) 
fp.close() 

Jednak, kiedy otworzyć test.bin widzę następujące w formacie ASCII zamiast binarnego.

\x61\x62\x63\x64\x65\x66\x67 

Rozumiem, ponieważ za dwa ukośniki tutaj ("\\ x% s"). Jak mogę rozwiązać ten problem? Z góry dziękuję.

Aktualizacja:

następstwie daje mi oczekiwany wynik:

file = open("test.bin", "wb") 
file.write("\x61\x62\x63\x64\x65\x66\x67") 
file.close() 

Ale jak mogę to osiągnąć z "abcdef" łańcucha ASCII. ?

+0

Jesteś * bardzo ostrożny * kodujesz znaki jako szesnastkowy - dlaczego spodziewasz się zobaczyć cokolwiek innego? – jonrsharpe

+0

Jakiej mocy wyjściowej oczekiwałeś? Nie jestem pewien, czy rozumiesz, jaki tryb binarny * działa *, czy nawet to, co Python używa notacji '\ xhh' dla (i jest to po prostu * składnia *, sposób na wytworzenie wartości, a nie sama wartość). –

+0

@jonrsharpe, chcę napisać "\ x61 \ x62 \ x63 \ x64 \ x65 \ x66 \ x67" jako binarne do test.bin (nie jako ciąg znaków ASCII). Jak mogę to zrobić? I na koniec plik test.bin powinien być plikiem binarnym. – aMa

Odpowiedz

6

Ty źle co \xhh robi w ciągach Pythona. Użycie notacji w łańcuchach w języku Python to tylko składnia w celu utworzenia określonych punktów kodowych.

Możesz użyć '\x61', aby utworzyć ciąg znaków, lub możesz użyć 'a'; oba są tylko dwoma sposobami powiedzenia, że ​​daje mi ciąg znaków o wartości szesnastkowej 61, np. postać a ASCII:

>>> '\x61' 
'a' 
>>> 'a' 
'a' 
>>> 'a' == '\x61' 
True 

Składnia \xhh jest więc nie wartość; w ostatecznym wyniku nie ma znaków \ i x ani znaków.

Należy wystarczy napisać swój ciąg:

somestring = 'abcd' 

with open("test.bin", "wb") as file: 
    file.write(somestring) 

Nie ma nic magicznego plików binarnych; jedyną różnicą w pliku otwartym w trybie tekstowym jest to, że plik binarny nie przetłumaczy automatycznie nowych linii do standardu separatora linii dla twojej platformy; na przykład na Windows pisanie \n produkuje zamiast tego \r\n.

Z pewnością nie trzeba wykonywać ucieczek szesnastkowych, aby zapisać dane binarne.

W Pythonie 3 ciągi są dane Unicode i nie mogą po prostu być zapisane do pliku bez kodowania, ale w Pythonie typ str jest już zakodowane bajty. Tak więc na Pythonie 3 używałbyś:

somestring = 'abcd' 

with open("test.bin", "wb") as file: 
    file.write(somestring.encode('ascii')) 

lub używałbyś literowego ciągu bajtów; b'abcd'.

+0

dobre wyjaśnienie Zawsze zapominam o zmianach ciągów w py3 –

+0

możesz pójść jeszcze dalej '' a 'to' \ x61'' –

+1

@JoranBeasley: ** nie, nie możesz **. Interpreter CPython * może * wybrać optymalizację i możesz * mógł * skończyć z tym samym obiektem ciągu (a następnie 'jest' działa), ale to ** nie ** jest zalecane i nigdy nie powinieneś na niego liczyć. –

1

Myślę, że niekoniecznie rozumiesz, co jest binarne/ascii ... wszystkie pliki są binarne w tym sensie, że są po prostu bitami. ASCII jest tylko przedstawieniem niektórych bitów ... 99,9999% redaktorów plików pokaże swoje bity jako ASCII, jeśli to możliwe, a jeśli nie ma innego kodowania zadeklarowane w samym pliku ...

fp.write("abcd") 

jest dokładnie equivelent do

fp.write("\x61\x62\x63\x64")