Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Caracter escape Hexadecimal (https://www.clubdelphi.com/foros/showthread.php?t=85777)

rabata2001 04-05-2014 00:44:17

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

nlsgarcia 04-05-2014 22:31:54

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? :confused:

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.

rabata2001 07-05-2014 09:59:10

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.

nlsgarcia 09-05-2014 02:27:37

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...

:confused:

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 :confused: :
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.

Casimiro Notevi 09-05-2014 13:19:05

Cita:

Empezado por nlsgarcia (Mensaje 476232)
Nelson.

^\||/^\||/^\||/


La franja horaria es GMT +2. Ahora son las 18:08:26.

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