Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: AlbertoBSD en 21 Marzo 2018, 22:20 pm



Título: Migrar funcion de C a C# problema con tamaño de variable 16 y 32 bits
Publicado por: AlbertoBSD en 21 Marzo 2018, 22:20 pm
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)

Código
  1. #include<stdio.h>
  2.  
  3. unsigned short CRC(unsigned char *s, int len, unsigned short crcval);
  4.  
  5. int main() {
  6. unsigned char *test = "\x01\x55\x00\x00";
  7. printf("CRC: %u\n",CRC(test,4,0));
  8. return 0;
  9. }
  10.  
  11. unsigned short CRC(unsigned char *s, int len, unsigned short crcval) {
  12. register unsigned c,q;
  13. for (; len; len--) {
  14. c = *s++;
  15. q = (crcval ^ c) & 017;
  16. crcval = (crcval >> 4) ^ (q * 010201);
  17. q = (crcval ^ (c >> 4)) & 017;
  18. crcval = (crcval >> 4) ^ (q * 010201);
  19. }
  20. return (crcval);
  21. }

Codigo en C (Con depuracion)

Código
  1. #include<stdio.h>
  2.  
  3. unsigned short CRC(unsigned char *s, int len, unsigned short crcval);
  4.  
  5. int main() {
  6. unsigned char *test = "\x01\x55\x00\x00";
  7. printf("CRC: %u\n",CRC(test,4,0));
  8. return 0;
  9. }
  10.  
  11. unsigned short CRC(unsigned char *s, int len, unsigned short crcval) {
  12. register unsigned c,q;
  13. printf("Depurando CRC\n");
  14. for (; len; len--) {
  15. printf("len: %i\n",len);
  16. c = *s++;
  17. printf("c: %u\n",c);
  18. q = (crcval ^ c) & 017;
  19. printf("q: %u\n",q);
  20. crcval = (crcval >> 4) ^ (q * 010201);
  21. printf("crcval: %u\n",crcval);
  22. q = (crcval ^ (c >> 4)) & 017;
  23. printf("q: %u\n",q);
  24. crcval = (crcval >> 4) ^ (q * 010201);
  25. printf("crcval: %u\n",crcval);
  26. }
  27. return (crcval);
  28.  

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
  1. static void Main(string[] args)
  2. {
  3. byte[] test = new byte[] { 0x01,0x55,0x00,0x00 };
  4. Console.WriteLine("CRC: "+CRC(test,test.Length,0));
  5. }
  6.  
  7. public static ushort CRC(byte[] s,int len,ushort crcval) {
  8. ulong c, q;
  9. uint i = 0;
  10. while(len > 0)
  11. {
  12. Console.WriteLine("len: "+len);
  13. c = s[i];
  14. Console.WriteLine("c: " + c);
  15. q = (crcval ^ c) & 017;
  16. Console.WriteLine("q: " + q);
  17. crcval = (ushort)(((uint)crcval >> 4) ^ (q * 010201));
  18. Console.WriteLine("crcval: " + crcval);
  19. q = (crcval ^ (c >> 4)) & 017;
  20. Console.WriteLine("q: " + q);
  21. crcval = (ushort)(((uint)crcval >> 4) ^ (q * 010201));
  22. Console.WriteLine("crcval: " + crcval);
  23. len--;
  24. i++;
  25. }
  26. return crcval;
  27. }
  28.  
  29.  

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!


Título: Re: Migrar funcion de C a C# problema con tamaño de variable 16 y 32 bits
Publicado por: engel lex en 21 Marzo 2018, 22:47 pm
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)

Código:
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)


Título: Re: Migrar funcion de C a C# problema con tamaño de variable 16 y 32 bits
Publicado por: AlbertoBSD en 21 Marzo 2018, 22:59 pm
Pense que si lo interpretaba como Octal.

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