Zeichenkette in binären Daten suchen

8

Ich habe eine Binärdatei, die ich mit einem NSData-Objekt geladen habe. Gibt es eine Möglichkeit, eine Abfolge von Zeichen, zum Beispiel 'abcd', innerhalb dieser Binärdaten zu lokalisieren und den Offset zurückzugeben, ohne die gesamte Datei in eine Zeichenkette umzuwandeln? Scheint so, als sollte es eine einfache Antwort sein, aber ich bin mir nicht sicher, wie ich es machen soll. Irgendwelche Ideen?

Ich mache das unter iOS 3, also habe ich -rangeOfData:options:range: nicht verfügbar.

Ich werde das hier an Sixteen Otto vergeben, weil ich Strstr. Ich ging und fand den Quellcode für die C-Funktion strstr und schrieb ihn neu, um mit einem Byte-Array fester Länge zu arbeiten - was sich übrigens von einem Char-Array unterscheidet, da es nicht null-terminiert ist. Hier ist der Code, mit dem ich endete:

%Vor%

Dies gibt einen Zeiger auf das erste Vorkommen von Bytes zurück, das Ding, nach dem ich suche, im Puffer, dem Byte-Array, das Bytes enthalten sollte.

Ich nenne es so:

%Vor%     
Matt Long 02.12.2009, 18:14
quelle

3 Antworten

14

Konvertieren Sie Ihre Teilzeichenfolge in ein NSData -Objekt und suchen Sie nach diesen Byte in der größeren NSData mit rangeOfData:options:range: . Stellen Sie sicher, dass die Zeichenkodierungen übereinstimmen!

Auf dem iPhone, wo das nicht verfügbar ist, müssen Sie dies möglicherweise selbst tun. Die C-Funktion strstr() gibt Ihnen einen Zeiger auf das erste Auftreten eines Musters innerhalb des Puffers (solange keine Nullen enthalten!), Aber nicht den Index. Hier ist eine Funktion, die sollte den Job machen (aber keine Versprechen, da ich nicht versucht habe, es tatsächlich zu laufen ...):

%Vor%

Dies läuft in etwas wie O (nm), wobei n die Pufferlänge und m die Größe der Teilzeichenfolge ist. Es ist geschrieben, um mit NSData zu arbeiten, und zwar aus zwei Gründen: 1) Das scheint es zu sein, und 2) diese Objekte kapseln bereits sowohl die tatsächlichen Bytes als auch die Länge des Puffers.

    
Sixten Otto 02.12.2009, 18:18
quelle
1

Wenn Sie Snow Leopard verwenden, bietet sich die neue Option -rangeOfData: options: range: in NSData , das den Bereich des ersten Vorkommens eines Datenelements zurückgibt. Andernfalls können Sie mit der Methode -bytes selbst auf die Inhalte der NSData zugreifen, um Ihre eigene Suche durchzuführen.

    
user155959 02.12.2009 18:29
quelle
1

Ich hatte das gleiche Problem. Ich habe es anders herum gelöst, im Vergleich zu den Vorschlägen.

Zuerst formatiere ich die Daten (gehe davon aus, dass deine NSData in var rawFile gespeichert ist) mit:

%Vor%

Nun können Sie mit der NSScanner-Klasse ganz einfach Zeichenfolgen wie 'abcd' oder was auch immer Sie wollen verwenden und die ASCII-Zeichenfolge an den Scanner übergeben. Vielleicht ist das nicht wirklich effizient, aber es funktioniert, bis die Methode -rangeOfData auch für das iPhone verfügbar ist.

    
Andy 03.12.2009 01:29
quelle