Estoy trabajando en un programa de interfaz con algunos hardware que es el envío de datos a los que ha sido codificado y envuelto para enviar dentro de un bloque CDATA en un documento XML.

el software en el dispositivo por lo que yo sé está escrito en Python y estoy escribiendo la interfaz en Delphi.

los datos que el dispositivo envía es este

\x00E\x18\x10\x14}*UF!A\x81\xac\x08&\x02\x01\n\x15\x1a\xc2PP\x92\x17\xc2\xc1\xa0\x0e\x1a\xc2\xd0K\x94\’\x830\x11\x8b
\x84a_\xa0+\x04\x81\x17\x89\x15D\x91B\x05.\x84\xf1\x1b\x89%E\x00\x04\x9c\x0e\xc5\xc1=\x87\x0bE\xf18\x07\x1f\xc8a\xa5\x95\x08H\x80?\x84\x18\tPK\x8a$\t\xf1\xb2\x8e(J\xb0\x08\x91\x1eJ\xf0W\x0c-\x0b\xf0\x0e\x88\x07\x0c\x00\x9b\n
\x910Z\x06!\x92\xf0W\x073S
\x08\x87\xff\xff\xff\xf0\x0e\xff\xff\xff\xff\xff\xf3 canon\x10\x0e\xba\xff\xff\xff\xf4C
\xed\xbb\xb9_\xffDD1\r\xcb\xbaw\xf5TD2\xed\xbb\xba\x88EUDB\x0c\xba\xaa\x99UUDB\x0c\xba\xaa\xa9UUD2\r\xbb\xaa\xaaUTD2\r\xcb\xbb\xaaUTC!\r\xcb\xbb\xbbUD3!\x0e\xdc\xbb\xbbDD3!\x0e\xdc\xcc\xbbDC2!\x0e\xdc\xcc\xcc33″\x11\x0e\xdd\xcc\xccC3″\x11\x0e\xed\xdc\xcc\xf33!\x10\x0e\xee\xdd\xcc\xf32!\x10\x0e\xee\xdd\xdc\xff2!\x10\x00\xee\xee\xdd\xff\xf2!\x11\x00\x0e\xee\xdd\xff\xf2!\x11\x10\x0e\xee\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00

Tengo que ser capaz de enviar datos similares de vuelta al dispositivo, pero el formato que tengo es en este

0x451C0E148A4A65781B0291080E1644b0680b340580a28615c9001e8f1ec9f0559d260a4147901a0af16d93304bc09a8523cc513e25218ca00cd42c0ce137891fcdb02397054dd07c04124e112408158e5124841e0ed17f8e28cee12c96284f511b231c8fb07c1228d09079bd31d090960b2050b075871cd1217b8d171131830b3552509a8e295271621d2e9271ad972ed371ab93fffcdffffffffffffcddffffffffffbccde0122fffffbccde01123fffbbbcde011234ffaabcde001233ffaabcce001234ffaaabcde01234ffaaabcde01234ffaaaabce01344faaa99abe12344faaa99abe124555faa99aac044555faa9999a96655ffaa9989998765ffaa98899bb855ffaa9999abbd45ffaa9999abcd34faaa999aabcd345faaa999bbcd33f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Sé que \x se utiliza generalmente para representar caracteres ascii utilizando sus valores hexadecimales en 2 pares de dígitos, pero mirando los datos de este no es el caso. yo estoy luchando para identificar la codificación utilizada y el fabricante no proporciona mucha ayuda.

lo que quiero saber es ¿cómo puedo convertir de hexadecimal tengo el formato que se está usando en Delphi xe4?

ENTRE los dos bloques no contienen los mismos datos, pero es el mismo tipo de datos, es decir, el formato es el mismo solo que diferente codificación

ejemplo de los datos que se envían

POST ******** HTTP/1.1 Host: 172.16.1.136:8080 Accept-Encoding: identity Content-Length: 1552 Content-Type: text/xml Authorization: 1344354:PASS User-Agent: *********

<?xml version="1.0" encoding="utf-8"?> <Biometrics>   <Templates>
     <Template badge="1075" readerType="6" index="6" ts="2014-11-06T17:28:40.000+01:00" chk="3a6a4924ec04e668186b15e244e6fe73">   <![CDATA[     ['1075_6',
1415294920.3754971, [0, 0], [['3\x04\x00\x00\x00P\x00\x00E\x18\x10\x14}*UF!A\x81\xac\x08&\x02\x01\n\x15\x1a\xc2PP\x92\x17\xc2\xc1\xa0\x0e\x1a\xc2\xd0K\x94\'\x830\x11\x8b \x84a_\xa0+\x04\x81\x17\x89\x15D\x91B\x05.\x84\xf1\x1b\x89%E\x00\x04\x9c\x0e\xc5\xc1=\x87\x0bE\xf18\x07\x1f\xc8a\xa5\x95\x08H\x80?\x84\x18\tPK\x8a$\t\xf1\xb2\x8e(J\xb0\x08\x91\x1eJ\xf0W\x0c-\x0b\xf0\x0e\x88\x07\x0c\x00\x9b\n \x910Z\x06!\x92\xf0W\x073S \x08\x87\xff\xff\xff\xf0\x0e\xff\xff\xff\xff\xff\xf3\x10\x0e\xba\xff\xff\xff\xf4C \xed\xbb\xb9_\xffDD1\r\xcb\xbaw\xf5TD2\xed\xbb\xba\x88EUDB\x0c\xba\xaa\x99UUDB\x0c\xba\xaa\xa9UUD2\r\xbb\xaa\xaaUTD2\r\xcb\xbb\xaaUTC!\r\xcb\xbb\xbbUD3!\x0e\xdc\xbb\xbbDD3!\x0e\xdc\xcc\xbbDC2!\x0e\xdc\xcc\xcc33"\x11\x0e\xdd\xcc\xccC3"\x11\x0e\xed\xdc\xcc\xf33!\x10\x0e\xee\xdd\xcc\xf32!\x10\x0e\xee\xdd\xdc\xff2!\x10\x00\xee\xee\xdd\xff\xf2!\x11\x00\x0e\xee\xdd\xff\xf2!\x11\x10\x0e\xee\xef\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00']]] ]]> </Template>

  </Templates> </Biometrics> HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Type: text/xml;charset=ISO-8859-1 Transfer-Encoding: chunked Date: Thu, 06 Nov 2014 17:28:41 GMT

52 <?xml version="1.0" encoding="UTF-8"?><OperationStatus uid="">OK</OperationStatus> 0

Estas son las plantillas biométricas utilizadas por la Suprema Lector si que ayuda.

Solución

He logrado descifrar lo que está pasando con esto ahora. a su vez mi original de la cadena hexadecimal en el formato requerido estoy usando este código, espero que esto ayude a alguien más en el futuro. Por favor, siéntase libre de comentar y hacer sugerencias para mejorar el código.

class function TConvert.HexToPythonEscAscii(const aHexString: string): string;
var
  i: Integer;
  ByteArray: array of Byte;
begin
  Result := '';

  SetLength(ByteArray, (length(aHexString) div 2) );

  TConvert.HexToBytes(aHexString, ByteArray, length(ByteArray));

  for i := Low(ByteArray) to High(ByteArray) do
  begin
    if ByteArray[i] in [$20..$7E] then
    begin

      case ByteArray[i] of
        $5c : Result := Result +'\';
        $27 : Result := Result +'\''';
      else
        Result := Result + char(ByteArray[i])
      end;

    end
    else
    begin

      case ansichar(ByteArray[i]) of
        TAB : Result :=  Result + '\t';
        LF  : Result :=  Result + '\n';
        CR  : Result :=  Result + '\r';
      else
        Result :=  Result + '\x' + LowerCase(IntToHex(ByteArray[i], 2));
      end;

    end;
  end;
end;
Suena como una pregunta de reverseengineering.stackexchange.com.
Parece binario en lugar de texto codificado. ¿Qué hacen los docs decir?
Como para el \x que es un byte representa como hexadecimal. Todo lo demás es ascii.
docs decir esto pero es claramente errónea «los datos deben ser enviados en formato ASCII. Si una plantilla es binario, debe ser codificado en Base64»
He tenido estos comentarios desde el fabricante «creo que es un poco relativo, los caracteres individuales se expresan en UTF-8, aunque se podrían combinar para representar mayor UTF-16 elementos, pero como se presenta se puede hacer realmente con cualquier conjunto de caracteres. Por desgracia, algunos de los entornos o lenguajes de manipulación de unicode más fácil que otros; la nuestra su nativa, no tanto en otros. Así que para nosotros se convierte fácilmente en una simple cadena de caracteres ASCII. Cada char es todavía un ord() 0..255 por lo que puede ser leído/escrito en ascii, hexadecimal o unicode.»

OriginalEl autor Mike Taylor | 2014-11-07

1 Comentario

  1. 9

    Esto se parece a los datos binarios que se celebró en Python bytes objeto. Vagamente, bytes que se asignan a los caracteres ASCII imprimibles son presentados como los caracteres ASCII. Todos los demás bytes codificados \x** donde ** es la representación hexadecimal de los bytes.

    >>> b = b'\x00E\x18 x}*UF!Un\x81\xac\x08&\x02\x01\n\x15\x1a\xc2PP\x92' 
    >>> str(b) 
    '\x00E\x18 x}*UF!Un\x81\xac\x08&\x02\x01\n\x15\x1a\xc2PP\x92' 
    >>> ord(b[0]) 
    0 
    >>> ord(b[1]) 
    69 
    >>> ord(b, [2]) 
    24 
    >>> ord(b, [3]) 
    16 
    >>> ord(b, [4]) 
    20 
    >>> ord(b, [5]) 
    125 
    >>> ord(b, [6]) 
    42 
    >>> bytes(bytearray((0, 69, 24, 16, 20, 125, 42))) 
    '\x00E\x18 x}*' 
    >>> bytes(bytearray(rango(256))) 
    '\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15 
    \x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&aplicaciones de;\'()*+,-./0123456789:;[email protected] 
    MNOPQRSTUVWXYZ [\a\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86 
    \x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b 
    \x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0 
    \xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5 
    \xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda 
    \xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\jos\xee\xef 
    \xf0\xf1\xf2\xf3 canon\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff' 
    

    La documentación de Python describe bytes literales aquí: https://docs.python.org/3.4/reference/lexical_analysis.html#strings

    Cuanto a lo de los binarios de los medios, supongo que usted lo sabe.

    La siguiente pregunta es ¿cómo puedo manejar en Delphi?
    Es bastante fácil de analizar. Si usted se sale un ` then the next character will be x` y después de que dos dígitos hexadecimales. Eso es de un byte. De lo contrario, te ASCII. Si usted tenía una cadena en general, sería necesario atender a octal y otros escapa, pero parece que esto ha sido formateado por str(). Usted puede tirar de que en un TBytes con bastante facilidad a la derecha?
    muchas gracias no soy un python dev y esto era realmente desconcertante para mí. voy a dar un bash ahora.
    Gah formato de comentario en mal estado. Quise decir «sacar un \»
    acabo de probar ahora y los malos permitirá saber si estás en lo correcto

    OriginalEl autor David Heffernan

Dejar respuesta

Please enter your comment!
Please enter your name here