1

サーバーとデバイス間でzipアーカイブを送信しようとしていますが、何が間違っているのかを把握しようとしています。作業を楽にするために、現在、PHPMyAdminのアップロード機能を使用してファイルをアップロードし、エンコードの問題の可能性を減らしています。また、ダウンロードとして機能するクイックスクリプトを作成することで、データベース内のファイルが正しいことを確認しました。ただし、ファイルの名前を.zipファイルに変更する必要があります(ファイル名を指定しなかったため)。それは完璧に動作します。

サーバーは次のコードを使用してzipデータを提供します。($ adはオブジェクトであり、getZippedHTML()は実際のバイナリデータを復元します)json_encodeが不明な直接バイナリデータを出力しない問題を回避するためにUTF8エンコーディングを使用します。

$response['ad']=utf8_encode($ad->getZippedHTML();
print  json_encode($response);

iOS側では、次の方法でデータをデコードしようとしています。

NSString *zipString=[serverResponse valueForKey:@"ad"];
NSData *zipData=[zipString dataUsingEncoding:NSUTF8StringEncoding];
//Test retrieved data
[zipData writeToFile:zipPath atomically:YES];

ただし、ディスクに書き込まれるファイルは有効なzipアーカイブではないようです。unzipユーティリティはそれを使用できません。dataUsingEncodingを使用してデータをデコードするのではなく、データをもう一度エンコードしているという事実まで、問題を追跡しました。

UTF8でエンコードされた文字列を取得してNSDataに戻すにはどうすればよいですか?

4

1 に答える 1

0

あなたは試すかもしれません:

- (BOOL)getBytes:(void *)buffer maxLength:(NSUInteger)maxBufferCount 
    usedLength:(NSUInteger *)usedBufferCount encoding:(NSStringEncoding)encoding 
    options:(NSStringEncodingConversionOptions)options range:(NSRange)range 
    remainingRange:(NSRangePointer)leftover

Cポインタをバッファに渡します。次の方法でエンコードされたデータの長さを取得できます。

- (NSUInteger)lengthOfBytesUsingEncoding:(NSStringEncoding)enc

次に、次のコマンドを使用してNSDataオブジェクトを作成できます。

+ (id)dataWithBytes:(const void *)bytes length:(NSUInteger)length

これを達成するためのより便利な手段があるかもしれませんが、これらの方法はあなたが行きたいところにあなたを連れて行くと私は信じています。

于 2012-06-06T23:32:10.870 に答える