【发布时间】:2012-05-26 10:53:13
【问题描述】:
我真的不知道这怎么可能,但我正在检查两个文件的 MD5 哈希值,所以我可以确定它们是否相同。
问题是本地文件(存储在应用程序包中的文件)给出了正确的值,而存储在在线服务器上的文件给出了错误的值。但是,如果我在 Mac 上的终端中或通过某些互联网工具检查在线文件的 md5,它会给出正确的值。
这怎么可能?
这基本上就是我正在做的。
NSData *currencyData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.iworldtip.com/appl/texts/files/CountryCurrency.plist"]];
NSData *localCurrencyData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"CountryCurrency" ofType:@"plist"]];
NSString *currencyDataHashValue = [currencyData md5];
NSString *localCurrencyDataHashValue = [localCurrencyData md5];
if (![currencyDataHashValue isEqual:localCurrencyDataHashValue]) {
NSLog(@"Saving new version of currency plist\n\n%@ - %@", currencyDataHashValue, localCurrencyDataHashValue);
...
...
这是输出:
这是我正在使用的 md5 扩展(在网上某处找到):
.h 文件:
@interface NSString (MyExtensions)
- (NSString *) md5;
@end
@interface NSData (MyExtensions)
- (NSString*)md5;
@end
.m 文件:
#import "md5Extension.h"
#import <CommonCrypto/CommonDigest.h>
@implementation NSString (MyExtensions)
- (NSString *) md5
{
const char *cStr = [self UTF8String];
unsigned char result[16];
CC_MD5( cStr, strlen(cStr), result ); // This is the md5 call
return [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];
}
@end
@implementation NSData (MyExtensions)
- (NSString*)md5
{
unsigned char result[16];
CC_MD5( self.bytes, self.length, result ); // This is the md5 call
return [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];
}
@end
【问题讨论】:
-
你试过用NSLog输出
currencyData和localCurrencyData吗? -
另外,服务器配置为发送 plist 文件的内容类型是什么?
-
我不认为问题出在服务器上。因为当我尝试将 url 放入在线 md5 工具时,它给了我正确的。我没有尝试输出数据,谢谢 - 尝试一下,看看它会告诉我什么:)
-
由于您使用 HTTP 获取文件,您可能需要检查您实际收到的内容是否与存储的内容相同。特别是,行尾和行终止符可能是一个问题,如果您使用文本(XML plist 文件),字符编码也是一个问题。如果您使用的是二进制文件(编码的 plist 文件),则没有那么多。无论哪种方式,我都会转储 iOS 设备(或模拟器)上显示的内容并比较文件以查看它们是否相同。单个字节(例如附加的行终止符)可能会导致此行为。
-
终于让它工作了。部分原因是我的愚蠢和您的回答:D我在下面写了答案。如果您将评论写为答案,我会将其标记为正确。
标签: objective-c ios xcode md5