Problemilla al trabajar con hexadecimal
![Nota Nota](https://perlenespanol.com/foro/styles/prosilver/imageset/icon_post_target.gif)
Buenas,
Tengo un script que básicamente recorre un csv separado por comas, y utiliza el primer campo para pasarlo a hexadecimal y hacer un xor de los valores.
El problema está en que no consigo que el cálculo me lo haga correctamente, pero tampoco sé dónde está el fallo.
Aquí os dejo el código a ver si alguno me podéis iluminar, ya que yo no lo encuentro.
Los valores que tiene el csv son:
He intentado pasar los valores a decimal para trabajar con ellos, pero tampoco; y no consigo ver qué me está haciendo incorrectamente
Aún no lo he sacado al fichero porque en pantalla me muestra mal los valores...
Muchas gracias
Tengo un script que básicamente recorre un csv separado por comas, y utiliza el primer campo para pasarlo a hexadecimal y hacer un xor de los valores.
El problema está en que no consigo que el cálculo me lo haga correctamente, pero tampoco sé dónde está el fallo.
Aquí os dejo el código a ver si alguno me podéis iluminar, ya que yo no lo encuentro.
Using perl Syntax Highlighting
- # Valores fijos para el cálculo del checksum
- $bit1=0x09;
- $bit2=0x02;
- $bit6=0x03;
- $bit7=0xBC;
- $bit8=0xFF;
- $bit9=0x7E;
- # Damos la ubicacion del fichero SecurityCodes y lo abrimos para leer
- $Fichero_SecurityCodes="Serial.csv";
- open (ENTRADA,"<$Fichero_SecurityCodes") || die "ERROR: No puedo abrir el fichero $Fichero_SecurityCodes";
- # Damos la ubicacion del fichero de salida y lo abrimos para escribir
- $Fichero_Checksum="Salida.csv";
- open (SALIDA,">$Fichero_Checksum") || die "ERROR: No puedo abrir el fichero $Fichero_Checksum";
- # Metemos en tabla el fichero
- # Y usamos las entradas lista[0] para el nº de serie
- while (<ENTRADA>)
- {
- @lista = split( ";", $_);
- # Pasamos a hexadecimal el numero de serie
- $hexval = sprintf("%x", $lista[0]);
- # Comprobamos el tamaño del hexadecimal que nos sale para añadirle un 0 en caso de ser 5 digitos, ya que necesitamos trabajar de 2 en dos
- $length_hexval = length($hexval);
- # Si la longitud es menor de 6, ponemos un 0 al principio para que sean 6 digitos
- # y poder tener bytes de 2 digitos
- if ($length_hexval<6)
- {
- $hexval="0$hexval";
- }
- # Dividimos el hexadecimal en 3 bytes para usarlos posteriormente
- # $portion = substr($string_variable, start number, length);
- $bit3 = substr($hexval,0,2);
- $bit4 = substr($hexval,2,2);
- $bit5 = substr($hexval,4,2);
- #
- # Ponemos en mayúsculas los valores por si acaso
- $bit3=uc $bit3;
- $bit4=uc $bit4;
- $bit5=uc $bit5;
- # $bit3 = hex($bit3);
- # $bit4 = hex($bit4);
- # $bit5 = hex($bit5);
- # $bit3=sprintf("%#X",$bit3);
- # $bit4=sprintf("%#X",$bit4);
- # $bit5=sprintf("%#X",$bit5);
- # Ejecutamos para conseguir el Checksum
- $res1 = $bit1 ^ $bit2 ^ $bit3 ^ $bit4 ^ $bit5 ^ $bit6 ^ $bit7 ^ $bit8 ^ $bit9;
- # Convertimos el valor del checksum que sale en decimal a hexadecimal
- $decval2=sprintf("%#X",$res1);
- $decval = hex($res1);
- # Sacamos por pantalla lo que nos interesa
- print "\n";
- print "El nº de serie es $lista[0]\n";
- print "En hexadecimal $hexval \n";
- print "El bit3 es $bit3 \n";
- print "El bit4 es $bit4 \n";
- print "El bit5 es $bit5 \n";
- print "El checksum normal es: $res1 \n";
- print "El checksum en Hexadecimal es: $decval\n";
- print "El checksum en Hexadecimal es: $decval2\n";
- }
- close ENTRADA;
- close SALIDA;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Los valores que tiene el csv son:
Using text Syntax Highlighting
00958566;ADCB
00955935;ADCB
00938668;ADCB
00936859;ADCB
00936669;ADCB
00961979;ADCB
00955935;ADCB
00938668;ADCB
00936859;ADCB
00936669;ADCB
00961979;ADCB
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
He intentado pasar los valores a decimal para trabajar con ellos, pero tampoco; y no consigo ver qué me está haciendo incorrectamente
Aún no lo he sacado al fichero porque en pantalla me muestra mal los valores...
Muchas gracias