0

ネットワーク経由で受信したバイトから文字列を作成しようとしています。私が知っている 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 でエンコードされた値であるため、ASCII 記号のみが含まれているため、有効な utf-8 である必要があります。

4

2 に答える 2

0

結局、生のバイトは UTF-8 ではないかもしれません。または、プロセスが不適切な UTF-8 エンコーディング シーケンスがあると判断し、エンコーディングの試行が失敗する原因となっている可能性がありますdata+1data(私がおこがましいかもしれませんが、すべてを考慮に入れる必要があります。) いずれにせよ、あなたは自分の仮定に大きく依存しており、それは私たち全員が時々陥る罠です。

ここにあなたのための戦略があります。を使用して NSString インスタンスを作成しようとしてNSUTF8StringEncodingnil が返された場合は、 を使用してみてください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 に答える