2009-09-23 21 views
32

Na przykład chcę utworzyć plik o nazwie sample.bin i umieścić numer, na przykład 255, aby 255 zostało zapisane w pliku jako little-endian, FF 00. Lub 3826 do F2 0E.Jak mogę utworzyć plik binarny w Perlu?

Próbowałem używać binmode, jak powiedział perldoc.

+2

Co jest złego w ludziach, że ktoś faktycznie przegłosował to pytanie? –

+0

Myślę, że moja gramatyka nie jest tak dobra i nie jest dobrze zorganizowana. – domlao

+1

+1 do przesunięcia -1, to i jest to Perl. Uczucie subiektywne. : D –

Odpowiedz

38

Funkcja perl pack zwróci "binarne" dane zgodnie z szablonem.

open(my $out, '>:raw', 'sample.bin') or die "Unable to open: $!"; 
print $out pack('s<',255) ; 
close($out); 

W powyższym przykładzie 's' mówi się do wyprowadzenia short (16 bitów), a '<' zmusza go do trybu ostrokońcej.

Ponadto ':raw' w wywołaniu open informuje go umieścić uchwyt pliku w trybie binarnym na platformach gdzie się liczy (jest to równoważne użyciu binmode). Strona podręcznika PerlIO zawiera trochę więcej informacji na temat wykonywania operacji we/wy w różnych formatach.

+0

wow, widzę dzięki. Jestem nowy w PERL, więc myślę, że odwiedzę perldoc dla funkcji paczki. dzięki – domlao

+0

opakowanie to fajna funkcja. Zwróć szczególną uwagę na to, jakie znaki szablonowe są używane do kodowania wartości małych i endianowych vs. wielko-endianowych – mob

+0

dzięki Adamowi i mobrule. opakowanie jest idealne! dzięki – domlao

4

Tak, stosowanie BINMODE

Dla rozrywki (jeśli nie edukacja) moja pierwsza próba stworzenia pliku binarnego dołączonego binmode STDOUT i następujący:

sub output_word { 
    $word = $_[0]; 
    $lsb = $word % 256; 
    $msb = int($word/256); 
    print OUT chr($lsb) . chr($msb); 
    return $word; 
} 

DLA litość NIE UŻYWAJ TEGO KODU! Pochodzi z czasów, kiedy nie wiedziałem nic lepszego.

Można argumentować, że nadal nie, ale jest tu reprodukowane, aby pokazać, że można może kontrolować kolejność bajtów, nawet z metodami martwego mózgu, i ponieważ muszę "fess up.

Lepszą metodą byłoby zastosowanie pack jako sugerowanej Adam Batkin.

Myślę, że popełniłem okrucieństwo powyżej w Perlu 4. To było dawno temu. Chciałbym o tym zapomnieć ...

+3

Szukałem w jakimś starym kodzie, który ostatnio uważał, że to było niesamowite. To było bzdura i nie robiłem zbyt wiele programowania w ciągu ostatnich 2 lat. Czytałem gdzieś, że jeśli nie uważasz, że twój stary kod to bzdura, to jest coś nie tak z tobą. .... chciałbym zapamiętać, to był świetny artykuł. –

+1

Wielkie dzięki dla tego, kto mnie wzgardził. Mogę teraz usunąć plik źródłowy, na którym się trzymam, i proces uzdrawiania może się rozpocząć. – pavium

+1

Jeśli nie podoba ci się twoja odpowiedź, możesz ją usunąć. –

8

Możesz użyć pack do wygenerowania swoich danych binarnych. W przypadku struktur złożonych szczególnie miły jest model Convert::Binary::C.

CBC przetwarza pliki nagłówkowe C (z katalogu lub ze zmiennej w skrypcie). Wykorzystuje informacje z nagłówków do danych binarnych pack lub unpack.

Oczywiście, jeśli chcesz używać tego modułu, warto wiedzieć trochę C.

CBC daje możliwość, aby określić endianness i rozmiary dla swoich typów C, a można nawet określić funkcje do konwersji między rodzimymi typami Perla a danymi w pliku binarnym. Użyłem tej funkcji do obsługi kodowania i dekodowania stałych numerów punktów.

za bardzo podstawowy przykład chcesz użyć:

use strict; 
use warnings; 

use IO::File; 

use Convert::Binary::C; 

my $c = Convert::Binary::C->new('ByteOrder' => 'LittleEndian'); 

my $packed = $c->pack('short int', 0xFF); 

print $packed; 

my $fh = IO::File->new('outfile', '>') 
    or die "Unable to open outfile - $!\n"; 

$fh->binmode; 

$fh->print($packed); 

CBC nie naprawdę zabłysnąć w tym przykładzie, ponieważ jest po prostu pracować z jednym krótkim int.Jeśli potrzebujesz obsługi skomplikowanych struktur, które mogą mieć typedefs wyciągnięte z kilku różnych nagłówków C, będziesz bardzo szczęśliwy mając to narzędzie pod ręką.

Ponieważ jesteś nowy w Perlu, zasugeruję, aby zawsze use stict i use warnings. Ponadto można uzyskać use diagnostics, aby uzyskać bardziej szczegółowe wyjaśnienia komunikatów o błędach. Zarówno ta strona, jak i Perlmonks mają wiele dobrych informacji dla początkujących i wielu bardzo inteligentnych, wykwalifikowanych ludzi, którzy chętnie Ci pomogą.

BTW, jeśli zdecydujesz się na trasę pack, sprawdź pack tutorial, pomaga wyjaśnić nieco mistyfikacji dokumentacji pakietu.

+0

dzięki za wskazówki oraz za link do tutoriala do pakietu :) – domlao

Powiązane problemy