Adler-32 输出与预期值不匹配
Adler-32 output does not match expected values
在我的 .NET 代码中,我需要添加一个 4 字节的 Adler-32 值作为我的 zlib 压缩数据 (RFC 1950) 的尾部。这是我的 C# 函数:
private static readonly uint Modulus = 65521;
public static int Adler32(byte[] data, int offset, int length) {
uint a = 1, b = 0;
for (int counter = 0; counter < length; ++counter) {
a = (a + (data[offset + counter])) % Modulus;
b = (b + a) % Modulus;
}
return unchecked((int)((b << 16) + a));
}
下面是我获取四个字节的方式:
byte[] data = { 227, 228, 225, 5, 0 }; // compressed data
int adler32 = Adler32(data, 0, data.Length);
byte b1 = (byte)((adler32 >> 24) & 0xFF);
byte b2 = (byte)((adler32 >> 16) & 0xFF);
byte b3 = (byte)((adler32 >> 8) & 0xFF);
byte b4 = (byte)((adler32 >> 0) & 0xFF);
问题是,通过检查实际的 zlib 压缩数据,预期的字节应该是 {0, 67, 0, 35} 但我得到的值是 {10, 177, 2, 174} .我做错了什么?问候。
PS:有兴趣的,zlib压缩的实际输入是{9,12,13}。
事实证明函数是正确的。只是原始未压缩数据的校验和必须是 运行 而不是压缩结果。基本上,运行ning Adler32() on {9, 12, 13} 给了我想要的结果。问候。
在我的 .NET 代码中,我需要添加一个 4 字节的 Adler-32 值作为我的 zlib 压缩数据 (RFC 1950) 的尾部。这是我的 C# 函数:
private static readonly uint Modulus = 65521;
public static int Adler32(byte[] data, int offset, int length) {
uint a = 1, b = 0;
for (int counter = 0; counter < length; ++counter) {
a = (a + (data[offset + counter])) % Modulus;
b = (b + a) % Modulus;
}
return unchecked((int)((b << 16) + a));
}
下面是我获取四个字节的方式:
byte[] data = { 227, 228, 225, 5, 0 }; // compressed data
int adler32 = Adler32(data, 0, data.Length);
byte b1 = (byte)((adler32 >> 24) & 0xFF);
byte b2 = (byte)((adler32 >> 16) & 0xFF);
byte b3 = (byte)((adler32 >> 8) & 0xFF);
byte b4 = (byte)((adler32 >> 0) & 0xFF);
问题是,通过检查实际的 zlib 压缩数据,预期的字节应该是 {0, 67, 0, 35} 但我得到的值是 {10, 177, 2, 174} .我做错了什么?问候。
PS:有兴趣的,zlib压缩的实际输入是{9,12,13}。
事实证明函数是正确的。只是原始未压缩数据的校验和必须是 运行 而不是压缩结果。基本上,运行ning Adler32() on {9, 12, 13} 给了我想要的结果。问候。