使用ZipArchive解压缩NSData

时间:2012-12-05 12:41:50

标签: ios unzip ziparchive

我正在使用ZipArchive并正在从设备中读取数据。我想要做的是从设备中获取数据并解压缩。我能找到的唯一例子是获取数据,将其写入iOS设备上的文件,然后再次读取(解压缩)...

这是我将其写入磁盘的代码(不工作)......

    // 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];

当它达到“成功”时,它始终为NO ......即使'zipExists'为YES。

我有两个问题: 1.我没有成功地将数据写入磁盘,将其读回并解压缩。 2.我宁愿只解压缩数据(NSData)而不是通过将其写入磁盘并再次读回来...

我在发帖前搜索过,但无法找到解决方案...

1 个答案:

答案 0 :(得分:0)

跳过创建NSString - 这是你的问题(或其中之一)。直接从recvString创建数据对象。想想如果数据有空字节,使用%s会发生什么。