Ruby's pack and unpack erklärt

7

Auch nach dem Lesen der Standarddokumentation kann ich immer noch nicht verstehen, wie Rubys Array#pack und String#unpack funktionieren genau. Hier ist das Beispiel, das mir am meisten Probleme bereitet:

%Vor%

Ich habe erwartet, dass beide Operationen dieselbe Ausgabe zurückgeben: "abc". Jeder von ihnen "versagt" auf andere Weise (nicht wirklich ein Fehler, da ich wahrscheinlich das falsche Ding erwarte). Also zwei Fragen:

  1. Was ist die Logik hinter diesen Ausgaben?
  2. Wie kann ich den gewünschten Effekt erzielen, d. h. eine Folge von hexadezimalen Zahlen in die entsprechende Folge transformieren. Noch besser - wenn man eine Integer-Zahl n angibt, wie wird sie in eine Zeichenkette umgewandelt, die mit der Textdatei identisch ist, die, wenn sie als Zahl betrachtet wird (zB in einem Hex-Editor) gleich n?
  3. ist
Gadi A 05.12.2012, 17:57
quelle

4 Antworten

10

Wir haben heute Morgen an einem ähnlichen Problem gearbeitet. Wenn die Array-Größe unbekannt ist, können Sie Folgendes verwenden:

%Vor%

Sie können es umkehren mit:

%Vor%     
the Tin Man 05.12.2012, 18:41
quelle
5

Die Methode Array#pack ist ziemlich geheimnisvoll. Indem ich Frage (2) ansprach, konnte ich Ihr Beispiel zur Ausführung bringen:

%Vor%

Siehe die Ruby-Dokumentation für ein ähnliches Beispiel. Hier ist eine allgemeinere Art, es zu tun:

%Vor%

Dies ist wahrscheinlich nicht der effizienteste Weg, um Ihr Problem anzugehen; Ich vermute, dass es einen besseren Weg gibt, aber es würde helfen zu wissen, mit welcher Art von Input du anfängst.

Die #pack -Methode ist in anderen Sprachen wie Perl üblich. Wenn die Dokumentation von Ruby nicht hilft, können Sie die entsprechende Dokumentation an anderer Stelle konsultieren.

    
Eric Walker 05.12.2012 18:11
quelle
3

Die Anweisung 'H' String für Array#pack besagt, dass Array-Inhalte als Nibbles von Hex-Strings interpretiert werden sollen.

Im ersten von Ihnen bereitgestellten Beispiel:

%Vor%

Sie sagen, das erste Element des Arrays zu packen, als wäre es eine Folge von Nibbles (halbe Bytes) einer hexadezimalen Zeichenfolge: 0x61 in diesem Fall entspricht dem 'a' ASCII-Zeichen.

Im zweiten Beispiel:

%Vor%

Sie sagen, dass Sie drei Elemente des Arrays so verpacken sollen, als ob sie Nibbles wären (der obere Teil in diesem Fall): 0x60 entspricht dem ''' ASCII-Zeichen. Der niedrige Teil oder das zweite Nibble ( 0x01 ) "geht verloren" aufgrund fehlender '2' oder '*' Modifikatoren für "aTemplateString".

Was Sie brauchen, ist:

%Vor%

, um alle Nibbles aller Elemente des Arrays so zu packen, als wären es Hex-Strings.

Der Fall von 'H2' * char.size funktioniert nur, wenn die Array-Elemente nur 1-Byte-Hex-Strings darstellen.

Es bedeutet, dass etwas wie chars = ["6161", "6262", "6363"] unvollständig sein wird:

%Vor%

während:

%Vor%     
Redsadic 29.01.2015 14:16
quelle
2
  

Ich habe erwartet, dass beide Operationen die gleiche Ausgabe zurückgeben: "abc".

Der einfachste Weg zu verstehen, warum Ihr Ansatz nicht funktioniert hat, ist einfach mit dem zu beginnen, was Sie erwarten:

%Vor%

So scheint es, dass Ruby Ihre hex Bytes in einer langen Zeichenfolge erwartet anstatt in separaten Elementen eines Arrays. Also die einfachste Antwort auf Ihre ursprüngliche Frage wäre dies:

%Vor%

Dieser Ansatz scheint auch bei großen Eingaben vergleichsweise gut zu funktionieren:

%Vor%     
Dave 01.10.2014 09:00
quelle

Tags und Links