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:
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:
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% Die Methode Array#pack
ist ziemlich geheimnisvoll. Indem ich Frage (2) ansprach, konnte ich Ihr Beispiel zur Ausführung bringen:
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.
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:
während:
%Vor%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%