【问题标题】:Try to create NSString from bytes. It always returns an empty string尝试从字节创建 NSString。它总是返回一个空字符串
【发布时间】:2012-10-19 05:54:05
【问题描述】:

我正在尝试从通过网络接收到的字节创建一个字符串。我得到的 NSString 总是一个空的。

if (stringLength > 0) {
        NSData *bytes = [[NSData alloc] initWithBytes:data+1 length:stringLength];
        result = [[NSString alloc] initWithData:bytes encoding:NSUTF8StringEncoding];
        //result = [[NSString alloc] initWithBytes:data+1 length:stringLength encoding:NSASCIIStringEncoding];
    }

正如我所说,我得到一个空的 NSString。该字符串是一个 base64 编码值,因此它应该是有效的 utf-8,因为它只包含 ascii 符号。

【问题讨论】:

  • 该代码对我来说看起来不错(如果您不使用 ARC,则会出现内存泄漏)。问题一定出在其他地方。
  • 在创建NSData 对象之前NSLog("%@", data); 会发生什么?那它是空的吗?

标签: objective-c cocoa


【解决方案1】:

也许您的原始字节毕竟不是 UTF-8。或者,因为您传递的是data+1 而不是data 本身,所以可能导致编码尝试失败,因为该进程认为存在不正确的UTF-8 编码序列。 (如果我冒昧,请原谅我,但你必须考虑到一切。)无论如何,你严重依赖于你的假设,这是我们不时陷入的陷阱。

这是适合您的策略。如果您尝试使用NSUTF8StringEncoding 创建一个NSString 实例返回nil,那么请尝试使用NSISOLatin1StringEncoding。如果返回 nil,请尝试使用 NSMacOSRomanStringEncoding

即使你得到了一个不太正确的字符串,它仍然比一个 nil 字符串更好,因为它可以帮助你显示你是否在其他一些地方犯了错误。

祝你工作顺利。

【讨论】:

  • 我重新检查了字节,发现我的错误:我没有考虑指示字符串长度的字节。我用整数开始字符串。现在它正在工作。
【解决方案2】:

检查它是否真的是base64编码..

CFErrorRef error = NULL;
CFDataRef decodedData;
SecTransformRef decoder;

decoder = SecDecodeTransformCreate(kSecBase64Encoding, &error);
if (error) {
    CFShow(error);
    exit(-1);
}

SecTransformSetAttribute(decoder,
                         kSecTransformInputAttributeName,
                         (CFDataRef *)bytes,
                         &error);

if (error) {
    CFShow(error);
    exit(-1);
}

decodedData = SecTransformExecute(decoder, &error);

if (error) {
    CFShow(error);
    exit(-1);
}

【讨论】:

    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 2022-01-22
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2016-12-16
    相关资源
    最近更新 更多