Tengo el siguiente ejemplo:
3D020000000F0000112233445566778899AABBCCDDEEFF - Crc32 Input 280ACDA5 - Crc32 Result Pero con las siguientes calculadoras: sunshine2k y zorc.breitbandkatze no puedo reconstruir el resultado. La documentación dice: Polynomial- 04C11DB7 , Reverse- EDB88320 , Initvalue- FFFFFFFF y también el resultado no debe invertirse.
Busqué bibliotecas en NuGet y encontré a Nito , pero tampoco obtuve el resultado correcto. También probé todas las combinaciones con banderas y polinomios ( 04C11DB7 , EDB88320 ).
¿Alguien puede decir lo que estoy haciendo mal? ¿Están mal las calculadoras y la librería? También probé la misma combinación de polinom y banderas en ambos lados y la librería, pero obtuve un resultado diferente :-( ¿alguien puede decirle a una libreta que definitivamente es correcta?
Aquí mi código de prueba:
[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); }Los siguientes parámetros producen el resultado deseado 280ACDA5:
Initializer = 0xFFFFFFFF, TruncatedPolynomial = 0x04C11DB7, FinalXorValue = 0x00000000, ReverseResultBeforeFinalXor = true, ReverseDataBytes = trueEsto es idéntico (excepto por el orden de los bytes) a las herramientas en línea:
http://www.sunshine2k.de/codificación/javascript/crc/crc_js.html
El código C# completo es:
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 } }