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;
printf("Depurando CRC\n");
for (; len; len--) {
printf("len: %i\n",len);
c = *s++;
printf("c: %u\n",c);
q = (crcval ^ c) & 017;
printf("q: %u\n",q);
crcval = (crcval >> 4) ^ (q * 010201);
printf("crcval: %u\n",crcval);
q = (crcval ^ (c >> 4)) & 017;
printf("q: %u\n",q);
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!
el error está en como te está interpretando los numeros... tu codigo no debería ser sensible a largo (en tal caso siempre puedes usar and y recortar a 16 bits)
010201
en C se interpreta como octal y su valor decimal es 4225
esto se ve reflejado en el primer crcval impreso... en C# lo está interpretando como decimal
busca como se representan... por lo que veo creo que es \0###
o simplemente usa los valores octales como decimales (en lugar de 010201, usa 4225 y 017 es 15)
Pense que si lo interpretaba como Octal.
Muchas gracias Engel, con eso quedo, eres una maquina!! ;-) ;-) ;-)