2012-03-25 10 views
1

Ich habe eine binäre Datei, die ich hex Bytes in diesem regex suchen/ersetzen möchten. Ich weiß, dass es Befehlszeilenmethoden gibt, um dies mit Perl zu erreichen, aber wenn es eine Möglichkeit gibt, dies mit Objective-C/Cocoa zu tun, konnte ich es nicht finden. Die Perl-Methode von der Kommandozeile in OSX, die gut funktioniert, obwohl ich in einer Cocoa-Anwendung so zu übernehmen möchte - dankObjective-C Regex ersetzen Hex-Bytes?

Binärdatei: TEST

45 76 65 6E 20 69 66 20 79 6F 75 20 66 61 6C 6C 20 6F 6E 20 79 6F 75 72 20 66 61 63 65 2C 20 79 6F 75 27 72 65 20 73 74 69 6C 6C 20 6D 6F 76 69 6E 67 20 66 6F 72 77 61 72 64 2E 20 

Bytes zu ersetzen: 66 61 63 ersetzen mit: 61 72 73

Perl Beispiel:

# grep -Z -r -l face TEST | xargs -0 perl -pi -e "s/\x66\x61\x63/\x61\x72\x73/g" 

Antwort

3

Etwas nach dem Vorbild dieser sollte funktionieren:

// Change TEST to the absolute path of the file to read the data from 
NSString *fileName = @"TEST"; 
NSMutableData *data = [NSMutableData dataWithContentsOfFile:fileName]; 
if (data == nil || [data length] == 0) { 
    return; 
} 

Ihre ursprüngliche Frage:

char bytes[]  = {0x66, 0x61, 0x63}; 
char new_bytes[] = {0x61, 0x72, 0x73}; 

NSRange range = [data rangeOfData:[NSData dataWithBytes:bytes length:3] options:0 range:NSMakeRange(0, [data length])]; 
if (range.location == NSNotFound) { 
    return; 
} 

[data replaceBytesInRange:range withBytes:new_bytes]; 
[data writeToFile:fileName atomically:YES]; 

Edited für Wildcard (ich habe nur -1 für die Wildcard und kann in jeder beliebigen Stelle sein):

char bytes[]  = {0x66, -0x1, 0x63}; 
char new_bytes[] = {0x61, 0x72, 0x73}; 

NSUInteger dataLength = [data length]; 
if (dataLength < 3) { 
    return; 
} 

char *data_bytes = (char *)[data bytes]; 

int dataLengthMinus3 = dataLength - 3; 

for (NSUInteger i = 0; i < dataLengthMinus3; i++) { 
    if (bytes[0] == -0x1 || data_bytes[i] == bytes[0]) { 
     if (bytes[1] == -0x1 || data_bytes[i+1] == bytes[1]) { 
      if (bytes[2] == -0x1 || data_bytes[i+2] == bytes[2]) { 
       for (int z = 0; z < 3; z++) { 
        if (new_bytes[z] != -0x1){ 
         [data replaceBytesInRange:NSMakeRange(i+z, 1) withBytes:new_bytes[z]]; 
        } 
       } 
       i += 2; 
       continue; // Make this break if you only want to replace the first occurrence. 
      } 
     } 
    } 
} 
+0

@Inafziger, vielen Dank für die Beispiel. Ich kompilierte Ihren Code (keine Fehler), führen Sie es aus (keine Fehler), obwohl die Datei unverändert bleibt. Alles scheint so zu sein, dass es funktionieren sollte, also bin ich ein wenig perplex. Wenn Sie irgendwelche Gedanken haben, lassen Sie es mich wissen. –

+0

Haben Sie es im Debugger durchlaufen, um zu sehen, ob es früh zurückkehrt? – lnafziger

+0

Nach dem Ausführen des Debugger es es sieht für diese erscheint: 'Bytes \t char [3] \t [0] \t char \t 'B' [1] \t char \t '=' [2] \t char \t ' ? 'und newbytes ist:' new_bytes \t char [3] \t [0] \t char \t '=' [1] \t char \t 'H' [2] \t char \t 'I'' - so sieht es aus wie ein Codierproblem? –