0

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

4

2 回答 2

0

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

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

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

祝你在你的努力中好运。

于 2012-10-18T17:25:12.620 回答
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);
}
于 2012-10-18T21:54:05.950 回答