C# Crc32 实现
C# Crc32 implementation
我有以下示例:
3D020000000F0000112233445566778899AABBCCDDEEFF - Crc32 Input
280ACDA5 - Crc32 Result
但是使用以下计算器:sunshine2k and zorc.breitbandkatze 我无法重建结果。文档说:Polynomial-04C11DB7
、Reverse-EDB88320
、Initvalue-FFFFFFFF
以及结果不应反转。
我在 NuGet 上搜索了库并找到了 Nito,但也没有得到正确的结果。我还尝试了标志和多项式的所有组合(04C11DB7
、EDB88320
)。
有人能告诉我我做错了什么吗?计算器和库错了吗?我也尝试过在两侧和 lib 上使用相同的 polinom 和标志组合,但得到了不同的结果 :-( 有人可以告诉 lib 哪个绝对正确吗?
这是我的测试代码:
[Theory]
[InlineData("3D 00 00 00 00 10 00 00 23 00 00 00 00 00 00 08 12 34 56 78 00 00 00 00", "7B 8A 60 0F")]
[InlineData("3D020000000F0000112233445566778899AABBCCDDEEFF", "280ACDA5")]
public void Crc32_Test(string input, string assumedCrc32)
{
var definition = new Definition
{
Initializer = 0xFFFFFFFF,
TruncatedPolynomial = 0xEDB88320,
ReverseResultBeforeFinalXor = false,
ReverseDataBytes = false,
};
var whow = new Nito.HashAlgorithms.CRC32(definition);
var inputArray = DESFireSessionHandler.StringToByte(input);
var assumedCrc32Array = DESFireSessionHandler.StringToByte(assumedCrc32);
var crc32 = whow.ComputeHash(inputArray);
if (crc32.SequenceEqual(assumedCrc32Array))
Assert.True(true);
else if (crc32.Reverse().SequenceEqual(assumedCrc32Array))
Assert.True(true);
else Assert.False(true);
}
以下参数产生所需的结果 280ACDA5:
Initializer = 0xFFFFFFFF,
TruncatedPolynomial = 0x04C11DB7,
FinalXorValue = 0x00000000,
ReverseResultBeforeFinalXor = true,
ReverseDataBytes = true
这与在线工具相同(字节顺序除外):
http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
完整的C#代码为:
using System;
using static Nito.HashAlgorithms.CRC32;
public class Program
{
public static void Main()
{
var definition = new Definition
{
Initializer = 0xFFFFFFFF,
TruncatedPolynomial = 0x04C11DB7,
FinalXorValue = 0x00000000,
ReverseResultBeforeFinalXor = true,
ReverseDataBytes = true
};
var inputHex = "3D020000000F0000112233445566778899AABBCCDDEEFF";
var input = Convert.FromHexString(inputHex);
var whow = new Nito.HashAlgorithms.CRC32(definition);
var crc32 = whow.ComputeHash(input);
var crc32Hex = Convert.ToHexString(crc32);
Console.WriteLine(crc32Hex); // 280ACDA5
}
}
我有以下示例:
3D020000000F0000112233445566778899AABBCCDDEEFF - Crc32 Input
280ACDA5 - Crc32 Result
但是使用以下计算器:sunshine2k and zorc.breitbandkatze 我无法重建结果。文档说:Polynomial-04C11DB7
、Reverse-EDB88320
、Initvalue-FFFFFFFF
以及结果不应反转。
我在 NuGet 上搜索了库并找到了 Nito,但也没有得到正确的结果。我还尝试了标志和多项式的所有组合(04C11DB7
、EDB88320
)。
有人能告诉我我做错了什么吗?计算器和库错了吗?我也尝试过在两侧和 lib 上使用相同的 polinom 和标志组合,但得到了不同的结果 :-( 有人可以告诉 lib 哪个绝对正确吗?
这是我的测试代码:
[Theory]
[InlineData("3D 00 00 00 00 10 00 00 23 00 00 00 00 00 00 08 12 34 56 78 00 00 00 00", "7B 8A 60 0F")]
[InlineData("3D020000000F0000112233445566778899AABBCCDDEEFF", "280ACDA5")]
public void Crc32_Test(string input, string assumedCrc32)
{
var definition = new Definition
{
Initializer = 0xFFFFFFFF,
TruncatedPolynomial = 0xEDB88320,
ReverseResultBeforeFinalXor = false,
ReverseDataBytes = false,
};
var whow = new Nito.HashAlgorithms.CRC32(definition);
var inputArray = DESFireSessionHandler.StringToByte(input);
var assumedCrc32Array = DESFireSessionHandler.StringToByte(assumedCrc32);
var crc32 = whow.ComputeHash(inputArray);
if (crc32.SequenceEqual(assumedCrc32Array))
Assert.True(true);
else if (crc32.Reverse().SequenceEqual(assumedCrc32Array))
Assert.True(true);
else Assert.False(true);
}
以下参数产生所需的结果 280ACDA5:
Initializer = 0xFFFFFFFF,
TruncatedPolynomial = 0x04C11DB7,
FinalXorValue = 0x00000000,
ReverseResultBeforeFinalXor = true,
ReverseDataBytes = true
这与在线工具相同(字节顺序除外):
http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
完整的C#代码为:
using System;
using static Nito.HashAlgorithms.CRC32;
public class Program
{
public static void Main()
{
var definition = new Definition
{
Initializer = 0xFFFFFFFF,
TruncatedPolynomial = 0x04C11DB7,
FinalXorValue = 0x00000000,
ReverseResultBeforeFinalXor = true,
ReverseDataBytes = true
};
var inputHex = "3D020000000F0000112233445566778899AABBCCDDEEFF";
var input = Convert.FromHexString(inputHex);
var whow = new Nito.HashAlgorithms.CRC32(definition);
var crc32 = whow.ComputeHash(input);
var crc32Hex = Convert.ToHexString(crc32);
Console.WriteLine(crc32Hex); // 280ACDA5
}
}