1

我正在尝试在服务器和设备之间传输 zip 存档,并且试图找出我做错了什么。为了让生活更轻松,我目前使用 PHPMyAdmin 的上传功能上传了文件,以减少可能的编码问题。我还通过创建一个将其作为下载提供的快速脚本来确认数据库中的文件是正确的——除了必须将文件重命名为 .zip 文件(因为我没有指定文件名),它完美地工作。

服务器使用以下代码提供压缩数据。($ad 是一个对象,getZippedHTML() 的作用与听起来完全一样:它恢复实际的二进制数据)我使用 UTF8 编码来避免 json_encode 不会打印未知二进制数据的问题。

$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 存档——解压缩实用程序无法使用它。我已经找到了这个问题,因为我没有使用 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 回答