Migrar funcion de C a C# problema con tamaño de variable 16 y 32 bits

Iniciado por AlbertoBSD, 21 Marzo 2018, 22:20 PM

0 Miembros y 1 Visitante están viendo este tema.

AlbertoBSD

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#

Código (csharp) [Seleccionar]

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!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

engel lex

#1
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)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

AlbertoBSD

Pense que si lo interpretaba como Octal.

Muchas gracias Engel, con eso quedo, eres una maquina!!  ;-) ;-) ;-)
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW