将NSInteger传递给size_t,将NSInteger*传递给size_t*

Passing a NSInteger to a size_t and a NSInteger* to a size_t*

本文关键字:size NSInteger      更新时间:2023-10-16

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

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

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

这两种方法调用这些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在Mac和iPhone上的base64编码选项中给出了实现这一点的简单方法。

如果你真的想充实你的例子,请记住NSIntegerlongsize_tunsigned 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字符串,这不一定是真的。

假设NSInteger是某种积分类型,并且假设ln是该类型的变量(或自变量),则可以通过编码(size_t)ln或(仅C++)size_t(ln)static_cast<size_t>(ln) 将其强制转换为size_t

对于指向[数组]NSInteger-s的指针p,如果它们的大小不相同(如sizeof所示),则将NSInteger*强制转换为size_t*可能没有意义(或者至少会产生奇怪的效果)。如果您仍然想这样做,请考虑编码reinterpret_cast<size_t*>(p),但首先尝试static_cast<size_t*>(p)

请理解所有这些都在做什么,你可能会有不好的意外或未定义的行为(例如,当从32位到64位处理器,或者从大端到小端处理器时)。