c++ - 将 NSInteger 传递给 size_t 并将 NSInteger* 传递给 size_t*

标签 c++ objective-c

我的 C++ 知识一塌糊涂。我有 Apple 提供的代码,他们像往常一样提供了不完整的解决方案。

在此代码中,他们提供了两个空的方法 header :

- (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
}

谢谢。

最佳答案

首先,如果您想进行 base64 编码/解码,您会发现从一个正确制定的​​示例开始更容易。 Matt Gallagher 在 Base64 encoding options on the Mac and iPhone 中提供了执行此操作的简单方法.

如果你真的想充实你的例子,请记住 NSInteger 是一个 longsize_t 是一个 unsigned长。您可以将有问题的行替换为以下内容:

- (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 字符串,这不一定是真的。

关于c++ - 将 NSInteger 传递给 size_t 并将 NSInteger* 传递给 size_t*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11637965/

相关文章:

c++ - 在 C++ 中对文件中的值单独执行计算

c++ - 设置删除行为很奇怪

ios - 旋转 iPad 会将 View 的动画重置为开始

ios - 初始化 UIButton 时出现不需要的动画

ios - UISearchDisplayController 如何窃取 UISearchBar 事件

objective-c - 处理游戏中心通知

c++ - g++ 4.6 没有 <bits/c++config.h> 头文件 cstring 要求的文件

jquery - 图像处理编程

c++ - 指针字段在 C++ 中的行为不符合预期

iphone - 了解 Soundcloud cocoa 包装器 api