2012-12-05 2 views
0

ZipArchive를 사용하고 있으며 장치에서 데이터를 읽습니다. 내가하고 싶은 것은 장치에서 데이터를 가져와 압축을 풉니 다. 내가 찾을 수있는 유일한 예는 데이터를 가져 와서 iOS 기기의 파일에 쓰고 다시 읽는 것입니다. ...ZipArchive로 NSData 압축 해제

이것은 글을 쓰는 코드입니다 (작동하지 않습니다). 디스크 ...

// Read the data in... 
if ((recvStringLen = recvfrom(connectSock, recvString, 1025, 0, (struct sockaddr *)&broadcastAddr, &recvStringLen)) < 0) { 
    NSLog(@"ERROR: Unable to receive user perms message."); 
    [self showTimeoutError]; 
    return -1; 
} 

// get the file size... 
unsigned int fileSize = ((recvString[16] << 24) & 0xff000000) | 
         ((recvString[17] << 16) & 0xff0000) | 
         ((recvString[18] << 8) & 0xff00) | 
         (recvString[19] & 0xff); 

NSLog(@"fileSize: %i", fileSize); 

recvString[20+fileSize] = '\0'; // terminate the string... 

// convert the char data to a string 
NSString *stringData = [[[NSString alloc] initWithFormat:@"%s", &recvString[20]] autorelease]; 
NSData *data = [[[NSData alloc] initWithBytes:stringData length:fileSize] autorelease]; 

// write the data... 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:@"userinfo.zip"]; 
[data writeToFile:appFile atomically:YES]; 

// exist? 
BOOL zipExists = [[NSFileManager defaultManager] fileExistsAtPath:appFile]; 

NSString *zipFilePath = [documentsDirectory stringByAppendingPathComponent:@"userinfo.zip"]; 

NSString *output = [documentsDirectory stringByAppendingPathComponent:@"userinfo.dat"]; 

ZipArchive* za = [[ZipArchive alloc] init]; 

// unzip it... 
BOOL success = [za UnzipOpenFile:zipFilePath]; 
if(success) { 
    BOOL outSuccess = [za UnzipFileTo:output overWrite:YES]; 
    if(outSuccess != NO) { 
     NSLog(@"success"); 
    } 

    [za UnzipCloseFile]; 
} 

[za release]; 

BOOL datExists = [[NSFileManager defaultManager] fileExistsAtPath:output]; 

'성공'이되면 'zipExists'가 YES이지만 항상 성공합니다.

내가 가지고있는 두 가지 문제점 : 1. 데이터를 디스크에 성공적으로 기록하지 않고 다시 읽고 압축을 풀었습니다. 2. 차라리 그냥 ... 대신 디스크에 쓰기가 다시 읽기를 통해가는 데이터 (을 NSData를) 압축 해제 할

나는 ...

게시하기 전에 검색하지만, 해결책을 찾을 수 없습니다

답변

0

NSString 만들기를 건너 뛰십시오. 이것이 귀하의 문제 (또는 그 중 하나)입니다. recvString에서 직접 데이터 오브젝트를 작성하십시오. 데이터에 null 바이트가 있으면 % s을 사용하여 어떤 일이 일어나는지 생각해보십시오.

+0

감사합니다. 나는 변화를 만들었지 만 여전히 효과가 없다. 데이터를 디스크에 먼저 쓰지 않고 압축을 해제 할 수 있습니까? – user1614833