Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-05-2014
rabata2001 rabata2001 is offline
Miembro
 
Registrado: nov 2010
Posts: 88
Poder: 14
rabata2001 Va por buen camino
Post Caracter escape Hexadecimal

Buenas a todos

Tengo un hardware que me devuelve cada 5 segundos una serie de registros (todos agrupado en una sola linea), lo estoy leyendo con un componente tcpclient y su método receiveln.

Tcpclient1,receiveln(Buf,ls_fin). buf es un Pansichar y ls_fin es el caracter de escape de la cadena.

Cuando trabajo con este método en decimal, le paso un CRLF (retorno de carro, #13#10) y todo va perfecto, corta las cadena por separado, cada vez que se encuentra un retorno de carro, me trata una cadena independiente y continua con la otra.

El problema se trata cuando trabajo en hexadecimal. la cadena que me trae el metodo (varios registros), delphi me la pita con carateres raros

Delphi me pinta esto: 'Ž'#2#$1F, pero al convertirlo a caracteres ascii, me trae lo siguiente en hexadecimal:
Cita:
{8E} {02} {1F} {00} {5B} {36} {00} {00} {02} {00} {01} {02} {00} {00} {07} {02} {25} {00} {0C} {01} {79} {06} {01} {00} {81} {04} {97} {12} {02} {00} {8F} {8E} {02} {1F} {00} {5B} {36} {00} {00} {02} {00} {01} {02} {00} {00} {07} {02} {25} {00} {0C} {01} {79} {06} {01} {00} {81} {04} {97} {12} {02} {00} {8F} {00}
Siendo el caracter 8F, el que corta la cadena (separacion de registros), debería de romper la cadena y tratarla como dos cadenas independientes.

¿Alguien podría orientarme de como enviar la cadena de fin de registro 8F?

Lo he intentado como

Código Delphi [-]
    ls_fin:=PAnsiChar('8F');
    ls_fin:='8F';
    ls_fin:='$' + '8F'
    ls_fin := IntToHex(Ord('8F'),1);
    .....


Gracias a todos por Vuestra colaboración.

Saludos

Última edición por Casimiro Notevi fecha: 04-05-2014 a las 09:53:56.
Responder Con Cita
  #2  
Antiguo 04-05-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
rabata2001,

Cita:
Empezado por rabata2001
...un hardware que me devuelve cada 5 segundos una serie de registros (todos agrupado en una sola linea)...lo estoy leyendo con un componente Tcpclient y su método Receiveln...Siendo el carácter 8F, el que corta la cadena...¿Alguien podría orientarme de como enviar la cadena de fin de registro 8F?...
Cita:
Empezado por rabata2001
Delphi me pinta esto: 'Ž'#2#$1F, pero al convertirlo a caracteres ascii, me trae lo siguiente en hexadecimal:

{8E} {02} {1F} {00} {5B} {36} {00} {00} {02} {00} {01} {02} {00} {00} {07} {02} {25} {00} {0C} {01} {79} {06} {01} {00} {81} {04} {97} {12} {02} {00} {8F} {8E} {02} {1F} {00} {5B} {36} {00} {00} {02} {00} {01} {02} {00} {00} {07} {02} {25} {00} {0C} {01} {79} {06} {01} {00} {81} {04} {97} {12} {02} {00} {8F} {00}
Pregunto:

1- ¿Como conviertes 'Ž'#2#$1F y obtienes la salida que indicas en Hexadecimal?, ¿'Ž'#2#$1F es la cadena completa recibida o solo una parte?.

2- ¿El proceso inverso de conversión no se podría aplicar a 8F para enviarlo como carácter separador?

3- ¿Puedes publicar el código de conversión con una cadena completa debidamente formateada (Donde empieza y donde termina cada carácter recibido para su posterior conversión a Hexadecimal)?.

Espero sea útil

Nelson.
Responder Con Cita
  #3  
Antiguo 07-05-2014
rabata2001 rabata2001 is offline
Miembro
 
Registrado: nov 2010
Posts: 88
Poder: 14
rabata2001 Va por buen camino
Post

Muchas gracias por tu aporte, Nelson

Te adjunto el trozo de código donde descodifico la información:

Código Delphi [-]
      While (li_i <= Longitud) and (ls_dato_Hex <> Gs_P3_EOR) Do
      Begin
        ls_dato_Hex := format('%x',[ord(Dato[li_i])]);

        ls_hex := ls_hex + '{' + ls_dato_Hex + '} ';

        ls_Cadena_Hex := ls_Cadena_Hex + Gs_Tabulador + ls_dato_Hex;
        Inc(li_i);
      End;

Gs_P3_EOR = Finde registro (cadena o sentencia 8F)
Dato:PAnsiChar
ls_dato_Hex, ls_cadena:String;

Entiendo que la instrucción format pasa de AnsiChar a codigo hexadecimal(%x).

Ante tus preguntas formuladas

Cita:
1- ¿Como conviertes 'Ž'#2#$1F y obtienes la salida que indicas en Hexadecimal?, ¿'Ž'#2#$1F es la cadena completa recibida o solo una parte?.
Es la cadena completa, cuando realiza la transformación (código indicado arriba), se puede observar que el contenido es más grande

Cita:
2- ¿El proceso inverso de conversión no se podría aplicar a 8F para enviarlo como carácter separador?
Eso es lo que quiero obtener. La pregunta va relacionada como paso 8F (Hexadecimal) a PAnsiChar, para que lo mande como fin de cadena.

Cita:
3- ¿Puedes publicar el código de conversión con una cadena completa debidamente formateada (Donde empieza y donde termina cada carácter recibido para su posterior conversión a Hexadecimal)?.
Código publicado.

el envío del fin de cadena se le indica a un componente TcpClient:

TcpClient1.Receiveln(ls_fin);

Dónde ls_Fin (8F), es el carácter a enviar como PAnsiChar, al menos eso entiendo.

Saludos.
Responder Con Cita
  #4  
Antiguo 09-05-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
rabata2001,

Cita:
Empezado por rabata2001
...Entiendo que la instrucción format pasa de AnsiChar a código hexadecimal(%x)...
Es correcto , en Delphi se puede convertir de Dec a Hex y viceversa de la siguiente forma:
Código Delphi [-]
 procedure TForm1.Button1Click(Sender: TObject);
 var
    Hex : String;
    Dec : Integer;
 
 begin
 
    Hex := '$8F'; // 8F en Hex = 143 en Dec
 
    // Convierte de Hex a Dec
    Dec := StrToInt(Hex);
    ShowMessage(IntToStr(Dec));
 
    // Convierte de Dec a Hex
    Hex := Format('%.2x',[Dec]);
    ShowMessage(Hex);
 
 end;
Cita:
Empezado por rabata2001
...Es la cadena completa, cuando realiza la transformación (código indicado arriba), se puede observar que el contenido es más grande...


Revisa este código:
Código Delphi [-]
 procedure TForm1.Button2Click(Sender: TObject);
 var
    i : Integer;
    Hex, HexFmt : String;
    Buffer : PAnsiChar;
 
 begin
 
    Buffer := 'Ž'#2#$1F;
 
    for i := 0 to Length(Buffer) - 1 do
    begin
       Hex := Format('%.2x',[Ord(Buffer[i])]);
       HexFmt := HexFmt + '{' + Hex + '} ';
    end;
 
    MessageDlg(HexFmt,mtInformation,[mbOK],0);
 
 end;
El código anterior, convierte la cadena de caracteres 'Ž'#2#$1F en su representación hexadecimal y muestra su contenido, el cual en este caso es el siguiente:



¿Por que la salida difiere de lo sugerido en el Msg #3?, en la cadena 'Ž'#2#$1F hay tres caracteres :

1- 'Ž' = 8E en Hex (En la cadena representado como un carácter).
2- #2 = 02 en Hex (En la cadena representado como un número decimal).
3- #$1F= 1F en Hex (En la cadena representado como un número hexadecimal).

Luego no entiendo lo siguiente :
Cita:
Empezado por rabata2001
Delphi me pinta esto: 'Ž'#2#$1F, pero al convertirlo a caracteres ascii, me trae lo siguiente en hexadecimal:

{8E} {02} {1F} {00} {5B} {36} {00} {00} {02} {00} {01} {02} {00} {00} {07} {02} {25} {00} {0C} {01} {79} {06} {01} {00} {81} {04} {97} {12} {02} {00} {8F} {8E} {02} {1F} {00} {5B} {36} {00} {00} {02} {00} {01} {02} {00} {00} {07} {02} {25} {00} {0C} {01} {79} {06} {01} {00} {81} {04} {97} {12} {02} {00} {8F} {00}
Sin embargo siguiendo la estructura de caracteres sugerida por la cadena 'Ž'#2#$1F, el carácter delimitador 8F debe venir de la siguiente forma en la cadena recibida : #$8F, luego:
Código Delphi [-]
 procedure TForm1.Button3Click(Sender: TObject);
 var
    EOL : PAnsiChar; //String; // AnsiString;
 
 begin
    EOL := #$8F;
    TcpClient1.Receiveln(EOL);
 end;
Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 09-05-2014 a las 02:44:15.
Responder Con Cita
  #5  
Antiguo 09-05-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por nlsgarcia Ver Mensaje
Nelson.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Reemplazar carácter por otro carácter rotsen26 OOP 3 27-05-2013 10:51:38
Leer texto caracter a caracter kikecg Firebird e Interbase 11 23-11-2010 17:44:44
leer caracter por caracter, una linea de un memo douglas OOP 1 05-10-2007 06:59:31
Ayudaaaa!!! Tabla ASCII: El carácter Ñ vs. carácter ¥ Berto2003 Varios 5 26-07-2005 15:37:48
Caracter de escape para comilla JOMABRI Varios 2 08-07-2004 23:02:50


La franja horaria es GMT +2. Ahora son las 13:23:39.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi