【问题标题】:Objective-C Implicit conversion loses integer precision (size_t to CC_Long)Objective-C 隐式转换丢失整数精度(size_t 到 CC_Long)
【发布时间】:2013-06-05 12:23:02
【问题描述】:

我有一个生成字符串的 sha256 加密的函数,

函数如下:

    -(NSString*)sha256HashFor:(NSString*)input
{
    const char* str = [input UTF8String];
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(str, strlen(str), result);

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++)
    {
        [ret appendFormat:@"%02x",result[i]];
    }
    return ret;
}

现在CC_SHA256(str, strlen(str), result); 的这一行是产生此警告的原因(警告是针对 strlen(str) 变量的)。

Implicit conversion loses integer precision: 'size_t' (aka 'unsigned long') to 'CC_LONG' (aka 'unsigned int')

我猜我只需要将 strlen(str) 转换为 CC_Long,但我不知道该怎么做。

【问题讨论】:

  • (CC_LONG)strlen(str)
  • 您使用什么样的编译器/工具链和设置?这似乎有点过于迂腐了。
  • 顺便说一句,为什么这会被标记为 osx 或自动引用计数……问题中的任何一个都恰好为零。
  • @mah 就像 iOS 编程问题用xcode 标记时一样 - 为什么? 如果 OP 使用 Eclipse 代替真的有关系吗?随便...

标签: objective-c macos


【解决方案1】:

此代码不会显示任何警告并且可以完美运行。

- (NSString*) sha256 {
    const char * pointer = [self UTF8String];
    unsigned char result[CC_SHA256_DIGEST_LENGTH];
    CC_SHA256(pointer, (CC_LONG)strlen(pointer), result);

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++)
    {
        [ret appendFormat:@"%02x",result[i]];
    }
    return ret;
}

【讨论】:

    【解决方案2】:

    从 iOS 的角度来看,CC_LONG(又名 uint32_t)和 size_t(unsigned long)大小不兼容这一事实在某些应用程序中可能是安全/稳定性问题,尤其是在处理可重用库函数时。

    MD5 散列是可能无限长消息的 128 位散列,因此这个警告是有充分理由的。如果你截断一个大于 2^32 的长度,你会得到一个不正确的哈希值。

    您的代码应该在逻辑上决定它可以支持多大的字符串。在这种使用 CC_MD5 的情况下,它必须是 2^32 字节。

    Maximum length for MD5 input/output

    【讨论】:

      【解决方案3】:
      1. 大概这不是错误而是警告。

      2. “我只需要将 strlen(str) 转换为 CC_Long,但我不知道该怎么做。” - 显式类型转换(类型转换):(CC_LONG)strlen(str),但我不认为你真的需要这个。

      【讨论】:

      • 这确实是一个警告......警告你理论上 size_t 可能比 CC_Long 大......添加一个演员说:是的,我知道,没关系
      • 这只是一个警告,但我的应用程序每次运行时都会在这条线上中断。
      • 我实际上修复了它,结果即使它打破了那条线,也是出于不同的原因。但是,这个答案仍然回答了原来的问题。摆脱了那个警告:D
      • 感谢您提供快速解决方案。它对我有用。非常感谢你
      猜你喜欢
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 2013-05-30
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多