En teoria deberia de ser el mismo resultado en ambos casos, sin embargo no es asi.
Codigo en C (Original sin depuracion)
Código
#include<stdio.h> unsigned short CRC(unsigned char *s, int len, unsigned short crcval); int main() { unsigned char *test = "\x01\x55\x00\x00"; return 0; } unsigned short CRC(unsigned char *s, int len, unsigned short crcval) { register unsigned c,q; for (; len; len--) { c = *s++; q = (crcval ^ c) & 017; crcval = (crcval >> 4) ^ (q * 010201); q = (crcval ^ (c >> 4)) & 017; crcval = (crcval >> 4) ^ (q * 010201); } return (crcval); }
Codigo en C (Con depuracion)
Código
#include<stdio.h> unsigned short CRC(unsigned char *s, int len, unsigned short crcval); int main() { unsigned char *test = "\x01\x55\x00\x00"; return 0; } unsigned short CRC(unsigned char *s, int len, unsigned short crcval) { register unsigned c,q; for (; len; len--) { c = *s++; q = (crcval ^ c) & 017; crcval = (crcval >> 4) ^ (q * 010201); q = (crcval ^ (c >> 4)) & 017; crcval = (crcval >> 4) ^ (q * 010201); } return (crcval);
Salida del codigo en C para el ejemplo Dado:
Código:
Depurando CRC
len: 4
c: 1
q: 1
crcval: 4225
q: 1
crcval: 4489
len: 3
c: 85
q: 12
crcval: 50964
q: 1
crcval: 7408
len: 2
c: 0
q: 0
crcval: 463
q: 15
crcval: 63379
len: 1
c: 0
q: 3
crcval: 16122
q: 10
crcval: 42725
CRC: 42725
Codigo en C#
Código
static void Main(string[] args) { Console.WriteLine("CRC: "+CRC(test,test.Length,0)); } public static ushort CRC(byte[] s,int len,ushort crcval) { ulong c, q; uint i = 0; while(len > 0) { Console.WriteLine("len: "+len); c = s[i]; Console.WriteLine("c: " + c); q = (crcval ^ c) & 017; Console.WriteLine("q: " + q); crcval = (ushort)(((uint)crcval >> 4) ^ (q * 010201)); Console.WriteLine("crcval: " + crcval); q = (crcval ^ (c >> 4)) & 017; Console.WriteLine("q: " + q); crcval = (ushort)(((uint)crcval >> 4) ^ (q * 010201)); Console.WriteLine("crcval: " + crcval); len--; i++; } return crcval; }
Salida del programa en C#
Código:
len: 4
c: 1
q: 1
crcval: 10201
q: 17
crcval: 42772
len: 3
c: 85
q: 1
crcval: 11688
q: 1
crcval: 9475
len: 2
c: 0
q: 1
crcval: 9609
q: 1
crcval: 9601
len: 1
c: 0
q: 1
crcval: 9601
q: 1
crcval: 9601
9601
El problema creo que se encuentra en la conversion de variables de 16 bits a 32 bits, pero e tratado de reasignar los valores con ANDS ( & 0xffff) para que queden de 16 bits y ni aun asi funciona.
Alguna ayuda.
Saludos!