首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >objective-c和C#上的不同adler32校验和

objective-c和C#上的不同adler32校验和
EN

Stack Overflow用户
提问于 2013-08-27 03:01:40
回答 1查看 1.9K关注 0票数 0

我正在用objective-c开发一个应用程序,它将一个文件和该文件的Adler32校验和发送到web服务。

在我将文件发送到web服务器后,回答说校验和失败。

这是我用来在objective-c上检查sum的代码:

代码语言:javascript
复制
//Get Asset NSData
ALAssetRepresentation *rep = [[p objectForKey:@"assetPath"] defaultRepresentation];
Byte *buffer = (Byte*)malloc(rep.size);
NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil];
NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];

//I also need a path to the file so I have to save the NSData to a local file
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *localFilePath = [documentsDirectory stringByAppendingPathComponent:@"png"];
[data writeToFile:localFilePath atomically:YES];
NSString *path = localFilePath;

//Now call the Adler
NSLog(@"checksum_fast:%@", [NSString stringWithFormat:@"%u", adler32_fast([data bytes], [data length])]);
NSLog(@"checksum:%@", [NSString stringWithFormat:@"%u", adler32([data bytes], [data length])]);

//Adler Lib
#define MOD_ADLER 65521
#define BUFFER_SIZE 1000

uint32_t adler32_update(uint32_t ck, const unsigned char data) {
  uint32_t a = ck & 0x0ffff, b = (ck >> 16) & 0x0ffff;
  a = (a + data) % MOD_ADLER;
  b = (b + a) % MOD_ADLER;
  return (b << 16) | a;
}

uint32_t adler32(const unsigned char *data, int data_len) {
  uint64_t ck = 1;
  for(int i=0; i<data_len; i++) {
    ck = adler32_update(ck,data[i]);
  }
  return ck;
}

uint32_t adler32_fast(const unsigned char *data, int data_len) {
  uint32_t a = 1, b = 0;
  for(int i=0; i<data_len; i++) {
    a = (a + data[i]) % MOD_ADLER;
    b = (b + a) % MOD_ADLER;
  }
  return (b << 16) | a;
}

下面是C# web服务的代码:

代码语言:javascript
复制
//It use ICSharpCode.SharpZipLib.dll    
byte[] buff = null;
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
long numBytes = new FileInfo(path).Length;
buff = br.ReadBytes((int)numBytes);

Adler32 adler = new Adler32();
adler.Reset();
adler.Update(buff, 0, buff.Length);
fs.Close();
fs.Dispose();
br.Close();
buff = null;
return Convert.ToString(adler.Value, 16);

有人知道为什么我会得到不同的校验和结果吗?

测试文件:http://we.tl/gjqSj43238

Adler32 C#:701ea682 (1881056898)

Adler32对象-C: 70100C51 (1880099921)

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2013-08-28 10:05:47

最重要的是,你把Adler拼错了。您的常量应该是MOD_ADLER,而不是MOD_ALDER

您没有提供所有代码,所以我不知道您将该常量设置为什么。

您的代码并不像其名称所宣称的那样“快”,因为您每次都要进行模运算。如果你不打算推迟模运算,那么在那里有两个嵌套的循环是没有意义的。

1 & 0xFFFF看起来很愚蠢,因为它总是1

您的错误是将b初始化为1。它应该被初始化为0

啊,我看到了另一个错误:您的数据数组需要使用unsigned char,而不是char

我建议您复制adler32() implementation in zlib

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18451130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档