Convertir Hexadecimal A Decimal (SOLUCIONADO)


Ir a la página 1, 2  Siguiente

Objetivo: Convertir Hexadecimal A Decimal (SOLUCIONADO)
Hola soy nuevo en gambas, y necesito su ayuda... El problema es el siguiente: estoy recibiendo por puerto Ethernet una cadena de caracteres en hexadecimal y necesito convertirlos a decimal. espero me ayuden

última edición por MiguelVelandia el Domingo, 05 Septiembre 2010, 21:22; editado 1 vez
Perfil MP  
Objetivo: Re: Convertir Hexadecimal A Decimal
Hola.

dim iDireccion as integer

iDireccion=Cint(&f)

La variable queda con el valor entero 15.

Saludos

Perfil MP  
Objetivo: Re: Convertir Hexadecimal A Decimal
Hola,


La conversion corre correctamente, pero lo que quiero hacer es convertir el valor de una variable, estoy probando y no me funciona...


Saludos

Perfil MP  
Objetivo: Re: Convertir Hexadecimal A Decimal
DIM iDireccion AS Integer
DIM sHexa AS String = "&f"

iDireccion = CInt(Val(sHexa))
PRINT iDireccion

Objetivo: Re: Convertir Hexadecimal A Decimal
Gracias...

Funciona perfectamente... Explicare lo que debo hacer más detalladamente. Debo recibir por medio de un socket tcp y por puerto serial una cadena de caracteres hexadecimales que lo recibo desde una Central de Alarma, que me identifican un evento de alarma...

Un ejemplo de la trama en hexadecimal es el siguiente: 1234 18 1131 01 015 8

Cada parte de la trama aporta alguna informacion del evento, y necesito poder dividir o separar la trama como se muestra en el ejemplo, y no tengo idea de como hacer, he leido algunos tutoriales pero no lo muestra. Es decir,

Variable1=1234
Variable2=18
Variable3=1131
.
.
.
Variable6= 8

Puesto que con cada variable debo hacer una consulta a la base de dato e identificará la informacion del evento de alarma....


Saludos...

Perfil MP  
Objetivo: Re: Convertir Hexadecimal A Decimal
Si el carácter de separación es el espacio en blanco, deberías usarlo como parámetro de la función Split


FUNCTION Str2Hexa(pInput AS String) AS Integer[]
DIM aInput AS String[] = Split(pInput, " ", "", TRUE) 'el segundo parámetro de Split es un espacio en blanco y el tercero una cadena vacía
DIM item AS String
DIM result AS NEW Integer[]

FOR each item IN aInput
result.Add(Cint(Val(item)))
NEXT

RETURN result
END


Esta función te devolvería un array dinámico de tipo Integer con los valores en formato numérico y convertidos a decimales.

No dejes de leer la documentación de Split, Integer[] y String[].

Objetivo: Re: Convertir Hexadecimal A Decimal
Bien, la probé, pero como se haria si la trama no viene con esos espacios en blancos, es decir "1234181131010158", sino que necesitas dividirlos en subcadenas que varian en su longitud de caracteres (ejemplo: a:1234, b:18, c:1131, d:01, e:015, f:8)... ¿Existe alguna función como en c# en la que obtienes una subcadena de otra cadena, de a partir de X posicion, Y caracteres?
Le agradezco su respuesta.

Perfil MP  
Objetivo: Re: Convertir Hexadecimal A Decimal
Hola Miguel

Toda la información sobre el protocolo Contact-ID la tienes aquí:

http://www.smartelectron.ru/files/DC-05_Contact_ID.pdf

Desconozco la manera en que te llegan las tramas, si es con espacios o sin ellos. En cualquier caso te recomiendo eliminar los espacios de la cadena mediante la función Replace ( http://gambasdoc.org/help/lang/replace?es ). Por ejemplo:

laTrama = Replace("1234 18 1131 01 015 8", " ", "")


De esta manera laTrama valdrá 1234181131010158 y entonces será más fácil emplear las funciones de cadenas para extraer y/o posicionarnos en un determinado carácter, ya que el número de caracteres es siempre invariable.

Por ejemplo para extraer el número de abonado (account code), que son los 4 primeros caracteres:

sAccount = Left$(laTrama, 4)
' sAccount valdrá 1234


Luego puedes usar Mid$ para extraer por ejemplo los 2 siguientes caracteres, que corresponden al Tipo de Mensaje (que siempre será 18 ó 98) de esta forma:

sMsgType = Mid$(laTrama, 5, 2)
' sMsgType será = 18


Extraemos 2 caracteres a partir del 5º incluyendo éste.

Y así sucesivamente, viene muy bien explicado en la página 5 del pdf de Ademco - Contact-ID

Otra cosa a tener en cuenta es la comprobación de la validez de la trama mediante el último dígito, que es el Checksum o suma de verificación.
La fórmula para saber si es válida es:

(suma de todos los dígitos + digito de checksum) MOD 15 = 0

Es decir, sumando los 15 dígitos más el propio dígito de control, si lo dividimos entre 15 (que es el nº de dígitos totales excluyendo el de control) el resto de la división debe ser igual a 0. A tener en cuenta que si el dígito es un cero, habrá que interpretarlo como si fuera 10 para sumarlo.

Otra cosa es que el único grupo que puede contener caracteres hexadecimales creo que es sólo el primero (4 primeros caracteres) y que representa el identificador de un cliente. Se debe guardar tal cual en la base de datos, y solo será necesario convertirlo a entero a la hora de hacer la suma de verificación. El resto siempre son números (según recuerdo).

Por lo tanto lo primero es verificar la validez de la trama y si no es válida, salir del procedimiento, y sólo si lo es, analizarla y guardarla en la BD.

Bueno, si tienes más dudas vuelve a preguntar. Podría ayudarte con la función para iterar sobre los caracteres y sumarlos,

Saludos

Perfil MP  
Objetivo: Re: Convertir Hexadecimal A Decimal
Hola,

Excelente información me acabas de dar... Aclaraste muchas cosas, ademas sabes lo que necesito hacer, manejas la información. Voy a probar...

Gracias

Perfil MP  
Objetivo: Re: Convertir Hexadecimal A Decimal
Algo sé sobre el tema... llevo 20 años trabajando en el sector de Sistemas de Seguridad

Saludos

Perfil MP  
Ir a la página 1, 2  Siguiente

Página 1 de 2


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.2831s (PHP: -72% SQL: 172%)
Consultas SQL: 24 - Debug off - GZIP Activado