我的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;
}
这两个方法称为这些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
}
感谢。
答案 0 :(得分:0)
假设NSInteger
是某种整数类型,并且假设ln
是该类型的变量(或参数),您可以通过编码size_t
或者将其强制转换为(size_t)ln
。仅限C ++)size_t(ln)
或static_cast<size_t>(ln)
对于指针p
到[数组] NSInteger
- s,将NSInteger*
投射到size_t*
可能没有意义(或者至少会产生奇怪的效果)它们的大小不同(由sizeof
给出)。如果您仍然需要考虑编码reinterpret_cast<size_t*>(p)
,请首先尝试static_cast<size_t*>(p)
。
请理解这一切是做什么的,你可能会有不好的意外或未定义的行为(例如从32位处理器到64位处理器,或从big-endian到little-endian处理器)。
答案 1 :(得分:0)
首先,如果你想进行base64编码/解码,你会发现更容易从一个正确解决的例子开始,如何这样做。 Matt Gallagher在Base64 encoding options on the Mac and iPhone中提供了简单的方法。
如果你真的想要充实你的榜样,请记住NSInteger
是long
而size_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字符串,这不一定是真的。