2

私のC ++の知識は臭いです。Apple から提供されたコードを持っていますが、通常は不完全なソリューションを提供していました。

このコードでは、2 つの空のメソッド ヘッダーが提供されます。

- (NSString *)encodeBase64:(const uint8_t *)input length:(NSInteger)length
- (NSString *)decodeBase64:(NSString *)input length:(NSInteger *)length

理論的には、これらのメソッドは 2 つの C++ スタイルの関数を呼び出す必要がありますが、私の C++ の知識では無限の 2 乗に 1 を足したものではないため、??? を埋めてください。

- (NSString *)encodeBase64:(const uint8_t *)input length:(NSInteger)length
{
   // I need to call base64_encode and return its results as string... is this correct?

   return [NSString stringWithUTF8String:
       base64_encode(input, ???)];
    // ??? I need to pass a NSInteger to a size_t... how do I do that?
}


- (NSString *)decodeBase64:(NSString *)input length:(NSInteger *)length
{

// ??? = this method receives a NSInteger *length variable. How do I pass that
// to a size_t * variable required by base64_decode?

    NSString *st = [[NSString alloc] initWithBytes:
                    base64_decode([input UTF8String], ???)
                                            length:&length
                                          encoding: NSUTF8StringEncoding];

    return st;
}

これらの 2 つのメソッドは、これらの C++ 関数を呼び出します

char* base64_encode(const void* buf, size_t size)
{
   // bla bla bla
}

void* base64_decode(const char* s, size_t* data_len_ptr)
{
    // bla bla bla
}

ありがとう。

4

2 に答える 2

0

NSIntegerある整数型であると仮定し、コーディングによってlnキャストできるその型の変数 (または引数)または (C++ のみ) または(C++ のみ)またはsize_t(size_t)lnsize_t(ln)static_cast<size_t>(ln)

p[an array of] -s へのポインターの場合、( で指定されるように) サイズが同じでない場合、へNSIntegerのキャストは意味をなさない (または少なくとも奇妙な効果をもたらす) 可能性があります。それでも必要な場合は、コーディングを検討してください。ただし、最初は試してください。NSInteger*size_t*sizeofreinterpret_cast<size_t*>(p)static_cast<size_t*>(p)

これが何をしているのかを理解してください。悪い驚きや未定義の動作が発生する可能性があります (たとえば、32 ビットから 64 ビット プロセッサに移行する場合、またはビッグ エンディアンからリトル エンディアンに移行する場合)。

于 2012-07-24T19:32:26.563 に答える
0

まず、base64 のエンコード/デコードを行いたい場合は、適切に作成された例から始める方が簡単です。Matt Gallagher が、Mac と iPhone の Base64 エンコーディング オプションでこれを行うための簡単なレシピを提供しています。

あなたの例を本当に肉付けしたい場合NSIntegerは、それが であり、longsize_tあることに注意してくださいunsigned long。問題の行を次のように置き換えることができます。

- (NSString *)encodeBase64:(const uint8_t *)input length:(NSInteger)length
{
    return [NSString stringWithUTF8String:base64_encode(input, (size_t)length)];
}

- (NSString *)decodeBase64:(NSString *)input length:(NSInteger *)length
{
    size_t retLen;
    uint8_t *retStr = base64_decode([input UTF8String], &retLen);
    if (length)
        *length = (NSInteger)retLen;
    NSString *st = [[[NSString alloc] initWithBytes:retStr
                                        length:retLen
                                      encoding:NSUTF8StringEncoding] autorelease];
    free(retStr);    // If base64_decode returns dynamically allocated memory
    return st;
}

(ARC でコンパイルしている場合は、自動解放を削除してください。)

任意のバイト シーケンスが有効な UTF-8 文字列であるとは限りません。この API を使用すると、任意のバイトを送信できますが、有効な UTF-8 文字列にデコードされると想定されますが、これは必ずしも正しいとは限りません。

于 2012-07-24T19:59:11.490 に答える