我正在使用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)而不是通过将其写入磁盘并再次读回来...
我在发帖前搜索过,但无法找到解决方案...
答案 0 :(得分:0)
跳过创建NSString - 这是你的问题(或其中之一)。直接从recvString创建数据对象。想想如果数据有空字节,使用%s会发生什么。