尝试从字节创建NSString。它总是返回一个空字符串

时间:2012-10-18 10:00:21

标签: objective-c cocoa

我正在尝试通过网络从字节a创建一个字符串。 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符号。

2 个答案:

答案 0 :(得分:0)

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

这是适合你的策略。如果您尝试使用NSUTF8StringEncoding创建NSString实例,则返回nil,然后尝试使用NSISOLatin1StringEncoding。如果返回nil,则尝试使用NSMacOSRomanStringEncoding

即使在所有这些之后,你得到一个不太正确的字符串,它仍然比一个零字符串好,因为它可以帮助向你显示是否存在其他一些你犯了错误的区域。 / p>

祝你工作顺利。

答案 1 :(得分:0)

检查它是否真的是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);
}