附加图像数据后NSData变为零

时间:2013-05-28 15:34:09

标签: ios objective-c utf-8 nsstring nsdata

我在NSData遇到了非常奇怪的行为。当我尝试添加图像数据时,NSData var被莫名其妙地设置为nil:

NSMutableData *postbody = [NSMutableData data];
    [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@.jpg\"\r\n", filename] dataUsingEncoding:NSUTF8StringEncoding]];
    [postbody appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    UIImage *i = [UIImage imageNamed:@"pic2"];
    NSLog(@"image data %@", UIImagePNGRepresentation(i));
    [postbody appendData:UIImagePNGRepresentation(i)];
    [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    NSString *bodyString = [[NSString alloc] initWithData:postbody encoding:NSUTF8StringEncoding];
    NSLog(@"body %@", bodyString);

上面记录的图像数据显示UIImagePNGRepresentation(i)实际上是返回数据,但是当记录body时,日志显示为nil。为什么会这样?

1 个答案:

答案 0 :(得分:4)

PNG表示无效UTF-8。 postbody包含“任意”数据 - 它不能(可靠地)转换为UTF-8字符串(每个字符表示形式的结构化变量八位字节)。因此,当您尝试从数据创建NSString时,它会失败,因为它发现UTF-8格式不正确。

NSString *bodyString =
  [[NSString alloc] initWithData:postbody encoding:NSUTF8StringEncoding];
                                 ^^^^^^^^            ^^^^