我的 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
是一个 long
而 size_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/