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 _...
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;
}
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
AYUDA Validacion LRC para datafono
-
- Posts: 262
- Joined: Sun Jan 31, 2010 3:30 pm
- Location: Bucaramanga - Colombia
- Antonio Linares
- Site Admin
- Posts: 42270
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
Re: AYUDA Validacion LRC para datafono
Aqui tienes la función usando el código que proporciona el proveedor y parece funcionar como el de Harbour:
Code: Select all | Expand
#include "FiveWin.ch"
function Main()
MsgInfo( NumToHex( LRC( "06,001000CRT050178174110" ) ) )
return nil
#pragma BEGINDUMP
#include <hbapi.h>
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);
}
HB_FUNC( LRC )
{
hb_retnl( calcularLRC( ( unsigned char * ) hb_parc( 1 ), hb_parclen( 1 ) ) );
}
#pragma ENDDUMP
-
- Posts: 262
- Joined: Sun Jan 31, 2010 3:30 pm
- Location: Bucaramanga - Colombia
Re: AYUDA Validacion LRC para datafono
Antonio... buena noche.
Funciono ... Muchas gracias
Jonsson Russi
Funciono ... Muchas gracias
Jonsson Russi