将NSInteger传递给size_t,将NSInteger*传递给size_t*
Passing a NSInteger to a size_t and a NSInteger* to a size_t*
我的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编码选项中给出了实现这一点的简单方法。
如果你真的想充实你的例子,请记住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字符串,这不一定是真的。
假设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位处理器,或者从大端到小端处理器时)。
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么(-1)%vector::size()总是返回0
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- vector.size() 在比较中意外工作
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 返回 str vs. str.substr(0,str.size()) 在 leetcode 中给了我不同的输出
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 为什么"(!v.empty())"比"(v.size() >0)"好?
- 迭代器库中的 std::size() 不适用于传递给函数的 C 样式数组
- std::string.size() 未知行为
- 为什么gmp会在这里与"invalid next size"重新定位一起崩溃?
- 为什么我会"Invalid read of size 8"?(瓦尔格林德)
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 使用 std::size 来自非 const 上下文
- "fast"或"normal"在"free(): invalid next size (fast)"中是什么意思?
- 行 - " vector<int> used(adj.size(), 0); "是什么意思?