In Perl kann ich behandeln Strings als byte-array?
In Perl, ist es angebracht, einen string als byte-array mit 8-bit-Daten? Alle Unterlagen, die ich finden kann zu diesem Thema konzentriert sich auf 7-bit-strings.
Zum Beispiel, wenn ich lese einige Daten aus einer binären Datei in $data
my $data;
open FILE, "<", $filepath;
binmode FILE;
read FILE $data 1024;
und ich möchte das erste byte aus, ist substr($data,1,1)
geeignet? (wieder, vorausgesetzt, es ist ein 8-bit-Daten)
Ich komme aus einer meist C hintergrund, und ich bin verwendet, um die übergabe eines char
Zeiger auf eine read()
Funktion. Mein problem könnte sein, dass ich nicht verstehe, was die zugrunde liegende Darstellung einer Zeichenkette in Perl.
InformationsquelleAutor Mike | 2010-06-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die mitgelieferte Dokumentation für den
read
Befehl, der hier wiedergegeben wird, enthält eine Menge von Informationen, die relevant für Ihre Frage.read FILEHANDLE,SCALAR,LENGTH,OFFSET
read FILEHANDLE,SCALAR,LENGTH
character
mehrdeutig. Ich war aber unklar, ob es bedeutet, eine Einheit von Daten (also einem byte) oder eine Einheit einer Schnur (abhängig von der Codierung)Aufruf
binmode FILE, ":raw"
oderbinmod FILE, ":bytes"
wird immer offener Ihre filehandle in "Byte" - Modus, unabhängig von Ihrem Standard-IO-layer (sagen, wenn Sie erklärtuse utf8
).Ich habe eigentlich damit einverstanden, dass die Verwendung von "Zeichen" liest sich wie ein Fehler an mir, vor allem angesichts der Tatsache, wie viel Augenmerk wird auf die Unterscheidung zwischen Zeichen, bytes und Bytes in
Encode(3perl)
. Es geschieht, um das richtige Wort, aber ich denke, ich würde es mögen, wenn es sagte, "Zeichen (definiert durch die aktuelle I/O-Ebene)". Ich denke, das ist auch eine Kritik an Ihrer Antwort, sofernread
liest immer "Zeichen" - aber manchmal "Zeichen" ist definiert als "Oktett" und manchmal als "UTF-8 code point".InformationsquelleAutor mob
Sehen perldoc -f pack und perldoc -f unpack wie zur Behandlung von strings als byte-arrays.
InformationsquelleAutor Ether
Die Sie wahrscheinlich verwenden wollen sysopen und sysread wenn Sie möchten, Lesen bytes aus Binär-Datei.
Siehe auch perlopentut.
Ob dies angemessen oder notwendig ist, hängt davon ab, was genau Sie zu tun versuchen.
Ausgabe:
InformationsquelleAutor Sinan Ünür
Strings sind Zeichenfolgen von "Zeichen", die größer als ein byte.Eins Sie können die store-bytes in Sie und manipulieren Sie, als ob Sie sind Zeichen, wobei
substr
s von Ihnen und so weiter, und so lange, wie Sie gerade die Manipulation von Entitäten im Speicher, alles ist ziemlich frisch. Die Speicherung der Daten ist seltsam, aber das ist meist nicht Ihr problem.ZweiWenn Sie versuchen, Lesen und schreiben von Dateien, die Tatsache, dass Ihre Zeichen möglicherweise nicht anzeigen, bytes wird wichtig und interessant. Nicht zu erwähnen, ärgerlich. Das ärgernis ist eigentlich ein bisschen schlechter von Perl zu tun versuchen, was Sie wollen in der gemeinsamen Fall: Wenn alle Zeichen in den string passen in ein byte und Sie geschehen zu sein auf einem nicht-Windows-OS, die Sie eigentlich nicht haben, etwas besonderes zu tun, um Lesen und schreiben von bytes. Perl wird sich beschweren, aber wenn Sie gespeichert haben, eine nicht-byte-sized-Charakter und versuchen, es zu schreiben, ohne ihm eine Ahnung, was mit ihm zu tun.
Dies ist immer ein wenig zu weit Weg, vor allem, weil die Codierung ist ein großes und verwirrend Thema. Lassen Sie mich lassen es sich dort mit einigen Referenzen: Blick auf Encode(3perl), open(3perl), perldoc öffnen, und perldoc binmode für die vielen lustigen und blutigen details.
So die zusammenfassende Antwort lautet "ja, Sie können behandeln, strings, als ob Sie die enthaltenen bytes, wenn Sie in der Tat enthalten die bytes, die Sie versichern kann, indem Sie nur das Lesen und schreiben von bytes.".
Eins: Oder pedantisch", die Ausdrücken können, eine größere Bandbreite von Werten als ein byte, aber Sie sind gespeichert als bytes, wenn das ist bequem". Ich denke.
Zwei: Für die Aufzeichnung, Zeichenketten in Perl kann auch intern vertreten durch eine Daten-Struktur namens ein 'PV', die neben einer Charakter-Zeiger weiß, Dinge wie die Länge der Zeichenfolge und der aktuelle Wert von
pos
.DreiDrei: Gut, es wird starten Sie die Speicherung des aktuellen Wertes des
pos
wenn es beginnt, interessant. Siehe auchInformationsquelleAutor darch
Könnte es helfen mehr, wenn Sie uns sagen, was Sie zu tun versuchen mit dem byte-array. Es gibt verschiedene Möglichkeiten für das arbeiten mit binären Daten, und jede eignet sich, um einen anderen Satz von tools.
Wollen Sie zum konvertieren der Daten in ein Perl-array? Wenn dem so ist,
pack
undunpack
sind ein guter Anfang.split
könnte auch nützlich sein.Wollen Sie den Zugriff auf die einzelnen Elemente der string-ohne Auspacken? Wenn dem so ist,
substr
ist blitzschnell und wird den trick tun für die 8-byte-Daten. Wenn Sie möchten, dass andere bit-tiefen, werfen Sie einen Blick auf dievec
- Funktion, die Laufflächen, die einen string als bit-Vektor.Tun, das Sie Scannen möchten, der string und konvertieren bestimmte Byte, weitere bytes? Dann die
s///
odertr///
Konstrukte nützlich sein könnten.InformationsquelleAutor Eric Strom
Erlauben Sie mir nur zur post ein kleines Beispiel über die Behandlung von Strings als binäres array - seit ich selbst fand es schwierig zu glauben, dass etwas namens "substr" würde behandeln von null-bytes; aber scheinbar ist es nicht - unten ist ein Ausschnitt von einem perl-debugger terminal session (mit beiden string und array/Liste-Ansätze):
InformationsquelleAutor sdaau