Buena tarde...
El proveedor del datafono solicita que se valide la sarta generada para enviar datos al datafono ; (LRC)
para lo cual envía 2 rutinas ( vb y c++ ) , como se muestra abajo ...
Se implemento con un método del foro de fivewin... pero obtengo valores diferentes en algunos casos...
La ayuda es validar si el método fivewin hace la misma tarea que hacen los métodos de vb y c++ del proveedor
Gracias
JONSSON RUSSI
Colombia
// vb
Párametro de entrada (s): cadena en valores hexadecimales. Ej: 02006236303030303030303030313030302020301C
'Retorna el LRC en valor Hexadecimal. Ej. 5D
Private Function CheckLCR(ByVal s As String) As String
Dim checksum As Integer = 0 'Este valor lo reemplazé por 2 y todo salió de maravillas.
For Each c As Char In GetStringFromHex(s)
checksum = checksum Xor Convert.ToByte(c)
Nextini
Return checksum.ToString("X2")
End Function
Private Function GetStringFromHex(ByVal s As String) As String
Dim result As String = Nothing
Dim s2 As String = s.Replace(" ", Nothing)
For i As Integer = 0 To s2.Length - 1 Step 2
result += Convert.ToChar(Integer.Parse(s2.Substring(i, 2),
System.Globalization.NumberStyles.HexNumber))
Next
Return result
End Function
// c++
int calcularLRC(unsigned char *pi_sTrama, int pi_iLongitud) {
int vl_iLRC, i;
vl_iLRC = (int) pi_sTrama[0];
for(i = 1; i < pi_iLongitud; i++ ) {
vl_iLRC = vl_iLRC ^ pi_sTrama[i];
}
return(vl_iLRC);
};
// SEGUN FORO DE FIVEWIN
function LRC( cText )
local nCheckSum := 0
local n
for n = 1 to Len( cText )
nCheckSum = nXor( nCheckSum, Asc( SubStr( cText, n, 1 ) ) )
next
return (nCheckSum)
// valores esperados vs obtenidos con metodo fivewin LRC() // valor esperado ... valor obtenido
alerta( NumToHex( LRC("07"))) // 24 .. 7
alerta( NumToHex( LRC("01501T050178174001102") ) ) //5A .. OK
alerta( NumToHex( LRC("03000000001000T050133337817418507328348732099999999999999912345678901100"))) // 6C .. OK
alerta( NumToHex( LRC("08250T050178174102238007200"))) // 71 ... 5D
alerta( NumToHex( LRC("05301786635710000") ) ) // 14 ..38
alerta( NumToHex( LRC("13501T05017817400110"))) // 47 ..6B
alerta( NumToHex( LRC("13501T0501781740011000000000000"))) //77 .. 5B
alerta( NumToHex( LRC("02T0501000157781741100"))) // 40 .. 6C
alerta( NumToHex( LRC("00838447000000020000000024838446000RAF85151209151600VENCIDO05/11/2015010829778CALLE22No.21-2200000000000000000000000000" ))) //63 .. OK
alerta( NumToHex( LRC("2110000137910000000A102837B1000100OSCROM0"))) // 10 .. 3C
alerta( NumToHex( LRC("00000006000000010000000000001379000031000029000RAF851512091718,00010829778,CALLE22No.21-22000000000000000000000000000000000000000000000"))) // 07 .. 7
alerta( NumToHex( LRC("0013624500000001000000000000137900000000862100000000010080237OSCROMcaja123000032000148000B0812130403181300VISAEL00A102938B39734005581512012266458AVEAMERICAS36-3700000000000000000000000000"))) // 13 ..33
alerta( NumToHex( LRC("06,001000CRT050178174110"))) // 67 .. OK