2013-08-07 3 views
0

파일에 16 진수 바이트가 있습니다. NSData를 사용하여이 파일을 읽은 다음 NSdata를 int로 변환합니다. 이제 파일의 첫 번째 바이트를 다른 값으로 대체하려고합니다. 예 : int로 변환 할 때 첫 번째 바이트가 49 인 경우,이를 48로 변경 한 다음 파일에서 바꿉니다. 내가 어떻게 할 수 있니? 내가는 0x02에 첫 번째 바이트를 대체 할코코아의 첫 번째 바이트를 바꾸는 방법

<31414142 42434344 44454546 4654502d 4c494e4b 2d544553 54000000 00000000 00000000> 

:

위의 코드를 실행
NSData *data = [NSData dataWithContentsOfFile:@"file"]; 
    NSLog(@"Patch File: %@",data); 
    NSData *theData = [NSData dataWithData:[data subdataWithRange:NSMakeRange(0,1)]]; 
    int value = *(int*)([theData bytes]); 
    NSLog(@"%d",value); 
    if(value == 49) 
     value = 48; 
    NSLog(@"%d",value); 

, 그것은 보여이 내 코드입니다. 내가 어떻게 할 수 있니? 고마워요

답변

1

만 한 바이트를 교체하는 경우 replaceBytesInRange:를 사용할 필요가 정말 없습니다. 당신이 파일에서 int의 이진 표현을 읽으려고하는 경우

NSMutableData *data = [NSMutableData dataWithContentsOfFile:@"test"]; 

char *bytes = [data mutableBytes]; 
if (bytes[0] == 49) 
    bytes[0] = 48; 

NSError *error = nil; 
if (![data writeToFile:@"file" options:NSDataWritingAtomic error:&error]) 
    NSLog(@"Error occurred: %@", error); 

, 당신은 사용해야합니다 :

int value; 
[data getBytes:&value length:sizeof value]; 

if (value == 1234) 
    value = 4321; 

[data replaceBytesInRange:NSMakeRange(0, sizeof value) withBytes:&value]; 
+0

나는 질문이있다 : 만약 0x02로 변경해야한다면, int 타입이 2인가? – user2656381

+0

예, 0x02는 정수입니다. '0x02' 대신에''2'''를 쓰면 * 문자 * 2가됩니다. – dreamlax

+0

그래서 [0] = 50;을 바꾼다면 맞습니까? – user2656381

3

"NSMutableData"에는 대체 할 수있는 매우 편리한 기능 "replaceBytesInRange: withBytes:"이 있습니다.

그래서 이런 식으로 뭔가를 찾기 위해 코드를 수정 :

NSMutableData *data = [NSMutableData dataWithContentsOfFile:@"test"]; 
    NSLog(@"Patch File: %@",data); 
    int value; 

    [data getBytes: &value range: NSMakeRange(0,1)]; 
    NSLog(@"%d",value); 

    if(value == 49) 
     value = 48; 

    [data replaceBytesInRange: NSMakeRange(0,1) withBytes: &value]; 

    NSLog(@"%d",value); 

    NSError * error = nil; 
    BOOL success = [data writeToFile: @"file" options: NSDataWritingAtomic error: &error]; 
    if(success == NO) 
    { 
     NSLog(@"error writing data out -- %@", [error localizedDescription]); 
    } 
+0

수는 예제 코드를? 고마워요 – user2656381

+0

첫 번째 바이트가 0x02로 설정 되길 원합니다. 내가 어떻게 할 수 있니? 감사합니다 – user2656381

+0

당신의 코드를 사용했습니다 : [NSConcreteData replaceBytesInRange : withBytes :] : 인식 할 수없는 셀렉터가 인스턴스 0x10056ad80에 전송되었습니다. 2013-08-07 11:22:23.374 테스트 [1464 : 303] - [NSConcreteData replaceBytesInRange : withBytes :] : 인식 할 수없는 선택기를 인스턴스 0x10056ad80 – user2656381

관련 문제