Migrar una funcion de un lenguaje a otro no debería de ser problema, sin embargo estoy algo atorado con los resultado que me arroja una vez migrado.
En teoria deberia de ser el mismo resultado en ambos casos, sin embargo no es asi.
Codigo en C (Original sin depuracion)
#include<stdio.h>
unsigned short CRC(unsigned char *s, int len, unsigned short crcval);
int main() {
unsigned char *test = "\x01\x55\x00\x00";
printf("CRC: %u\n",CRC
(test
,4,0)); 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)
#include<stdio.h>
unsigned short CRC(unsigned char *s, int len, unsigned short crcval);
int main() {
unsigned char *test = "\x01\x55\x00\x00";
printf("CRC: %u\n",CRC
(test
,4,0)); 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);
printf("crcval: %u\n",crcval
); q = (crcval ^ (c >> 4)) & 017;
crcval = (crcval >> 4) ^ (q * 010201);
printf("crcval: %u\n",crcval
); }
return (crcval);
Salida del codigo en C para el ejemplo Dado:
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#
static void Main(string[] args)
{
byte[] test
= new byte[] { 0x01,0x55,0x00,0x00
}; 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#
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!