【问题标题】:Converting NSData to an NSString representation is failing将 NSData 转换为 NSString 表示失败
【发布时间】:2010-03-16 11:06:42
【问题描述】:

我有一个 NSData 对象,我正在尝试使用以下代码行将其转换为 NSString:

NSString *theData = [[NSString alloc] initWithData:photo encoding:NSASCIIStringEncoding];

不幸的是,我得到了以下结果,而不是我想要的二进制输出(我可以在这里期待二进制输出吗?);

ÿØÿà

如果有任何帮助,我将不胜感激。
谢谢。瑞奇。

【问题讨论】:

  • 一串二进制数据。

标签: cocoa nsstring nsdata


【解决方案1】:

如果您想将一些任意二进制数据转换为人类可读的字符串(例如,一系列十六进制值),则您使用了错误的方法。您正在做的是将数据本身解释为 ASCII 编码的字符串。

要将数据简单地记录到文件或标准输出,您可以使用[theData description]。

【讨论】:

    【解决方案2】:

    您所说的“二进制输出”是什么意思尚不清楚。如果您希望字符串包含“01010100011110110”或“0x1337abef”行中的文本,那么您就误解了 NSString 的工作原理。 NSString 的initWithData:encoding: 试图解释数据的字节,就好像它们是特定编码中字符串的字节一样。这与 NSString 的 dataUsingEncoding: 正好相反——你可以调用 initWithData:encoding: 并得到 dataUsingEncoding: 的结果并返回完全相同的字符串。

    如果您想将数据转换为人类可读的十六进制数字字符串,您需要自己进行转换。你可以这样做:

    NSMutableString *binaryString = [NSMutableString stringWithCapacity:[data length]];
    unsigned char *bytes = [data bytes];
    for (int i = 0; i < [data length]; i++) {
        [binaryString appendFormat:@"%02x", bytes[i]];
    }
    

    【讨论】:

    • 我相信,你的意思不是data[i],而是((unsigned char*)[data bytes])[i]。
    • 或多或少。更正为我认为我首先写的内容​​。哦。
    • 如果你已经使用了性能优化的stringWithCapacity:,你应该计算出正确的容量:2 * [data length]。
    • 对不起查克。感谢您的回复,但您在第二行中是对的 - 我在二进制输出之后,如“01010101”。我不能从 NSData 对象中提取它并从中创建一个字符串吗?谢谢,瑞奇。
    【解决方案3】:

    您无法使用 initWithData: 方法解析二进制数据。如果你想要内容的十六进制字符串,那么你可以使用 NSData 的description 方法。

    【讨论】:

    • 这不正确。 -[NSString initWithData:] 使用数据对象的全部内容(包括零字节)并以给定的编码对其进行解释。另请注意,'\0' 是 ASCII 中定义的字符。
    • 但是您当然是对的,该方法不能用于生成人类可读的字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2012-11-09
    • 2011-11-11
    相关资源
    最近更新 更多