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」が「はい」であっても。

私が抱えている 2 つの問題: 1. データをディスクに正常に書き込み、読み戻し、解凍していません。2.データをディスクに書き込んで再度読み取るのではなく、データ(NSData)を解凍するだけです...

投稿する前に検索しましたが、解決策が見つかりませんでした...

4

1 に答える 1

0

NSString の作成をスキップします-それがあなたの問題です(またはそれらの1つです)。recvString から直接データ オブジェクトを作成します。データに null バイトがある場合に %s を使用するとどうなるかを考えてみてください。

于 2012-12-05T13:04:45.220 に答える