0

我正在使用 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];

当它“成功”时,它总是“否”……即使“zipExists”是“是”。

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

发帖前搜了一下,没找到解决办法。。。

4

1 回答 1

0

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

于 2012-12-05T13:04:45.220 回答