2

我的 C++ 知识很糟糕。我有一个 Apple 提供的代码,他们通常提供了一个不完整的解决方案。

在此代码中,它们提供了两个空方法标头:

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

这些方法理论上应该调用两个 C++ 风格的函数,但是由于我的 C++ 知识很臭,无穷平方加一,请填写???

- (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是该类型的变量(或参数),您可以size_t通过编码(size_t)ln或(仅限 C++)size_t(ln)static_cast<size_t>(ln)

对于指向p[an array of] NSInteger-s的指针,如果它们的大小不同(由 给出),强制转换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 编码选项中提供了简单的方法。

如果您真的想充实您的示例,请记住 that NSIntegeris alongsize_tis an 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 回答