2014-11-07 17 views
5

Pracuję nad programem do połączenia z jakimś sprzętem, który wysyła dane, które zostały zakodowane i opakowane w celu wysłania w bloku CDATA w dokumencie XML.Czy każdy może zidentyfikować to kodowanie?

oprogramowanie w urządzeniu, o ile wiem, jest napisane w języku Python i piszę interfejs w Delphi.

dane urządzenie wysyła to jest

\ 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 \ xf3 \ x10 \ x0e \ xba \ xff \ xff \ xff \ xf4C \ xed \ xbb \ xb9_ \ xffDD1 \ r \ xcb \ xbaw \ xf5TD2 \ xed \ xbb \ xba \ x8 8EUDB \ x0c \ xba \ xaa \ x99UUDB \ x0c \ xaa \ xa9UUD2 \ r \ xbb \ xaa \ xaaUTD \ \ r \ xcb \ xbb \ xaaUTC! \ R \ xcb \ xbb \ xbbUD3! \ X0e \ xdc \ xbb \ xbbDD3! \ x0e \ xdc \ xcc \ xbbDC2! \ x0e \ xdc \ xcc \ xcc33 "\ x11 \ x0e \ xdd \ xcc \ 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

Muszę mieć możliwość wysyłania podobnych danych z powrotem do urządzenia, ale format, w którym go mam, to jest

0x451C0E148A4A65781B0291080E1644B0680B340580A28615C9001E8F1EC9F0559D260A4147901A0AF16D93304BC09A8523CC513E25218CA00CD42C0CE137891FCDB02397054DD07C04124E112408158E5124841E0ED17F8E28CEE12C96284F511B231C8FB07C1228D09079BD31D090960B2050B075871CD1217B8D171131830B3552509A8E295271621D2E9271AD972ED371AB93FFFCDFFFFFFFFFFFFCDDFFFFFFFFFFBCCDE0122FFFFFBCCDE01123FFFBBBCDE011234FFAABCDE0FFAABCCE0FFAAABCDEFFAAABCDEFFAAAABCE01344FAAA99ABE12344FAAA99ABE124555FAA99AAC044555FAA9999A96655FFAA9989998765FFAA98899BB855FFAA9999ABBD45FFAA9999ABCD34FAAA999AABCD345FAAA999BBCD33F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Wiem, że \ x jest zwykle używane do reprezentowania znaków ASCII przy użyciu ich wartości szesnastkowych w dwuznakowych parach, ale w tym przypadku nie chodzi o dane. Staram się zidentyfikować używane kodowanie, a producent nie zapewnia dużej pomocy.

co chcę wiedzieć, w jaki sposób mogę przekonwertować hex mam do formatu, którego używają w Delphi xe4?

BTW dwa blok nie zawierają te same dane, ale jest to ten sam typ danych, tj format jest taki sam, tylko inny kodowania

przykładem wysyłanych danych

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 

Są to szablony biometryczne używane przez Suprema Reader, jeśli to pomaga.

Rozwiązanie

I pomyślnie rozszyfrować, co się dzieje z tym teraz. aby zamienić mój oryginalny ciąg szesnastkowy w wymagany format, w którym używam tego kodu, mam nadzieję, że pomoże to komuś innemu w przyszłości. Prosimy o komentarze i sugestie dotyczące ulepszenia kodu.

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; 
+0

To brzmi jak pytanie dla http://reverseengineering.stackexchange.com/. – TLama

+0

Wygląda raczej na tekst binarny niż zakodowany. Co mówią doktorzy? –

+0

Co do \ x to tylko bajt reprezentowany jako hex. Cała reszta to ascii. –

Odpowiedz

7

Wygląda to na dane binarne przechowywane w obiekcie Python bytes. Luźno, bajty odwzorowujące drukowane znaki ASCII są prezentowane jako znaki ASCII. Wszystkie inne bajty są kodowane \x** gdzie ** jest reprezentacją szesnastkową bajtu.

 
>>> b = b'\x00E\x18\x10\x14}*UF!A\x81\xac\x08&\x02\x01\n\x15\x1a\xc2PP\x92' 
>>> str(b) 
'\x00E\x18\x10\x14}*UF!A\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\x10\x14}*' 
>>> bytes(bytearray(range(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 !"#$%&\'()*+,-./:;[email protected] 
MNOPQRSTUVWXYZ[\\]^_`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\xed\xee\xef 
\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff' 

dokumentacji Pythona opisuje bajtów literały tutaj: https://docs.python.org/3.4/reference/lexical_analysis.html#strings

Jak na co środki dwuskładnikowe, przypuszczam, że o tym wiesz.

+1

Następne pytanie brzmi: jak sobie z tym poradzić w Delphi? – MikeT

+0

Parsowanie jest łatwe. Jeśli zdejmiesz '\", następnym znakiem będzie "x", a następnie dwie cyfry szesnastkowe. To jeden bajt. W przeciwnym razie masz ASCII. Gdybyś miał ogólny ciąg znaków, musiałbyś obsłużyć ósemkowe i inne wyjścia, ale wygląda na to, że zostało to sformatowane przez 'str()'. Możesz wyciągnąć to na 'TBytes' dość łatwo prawda? –

+0

dziękuję bardzo im nie python dev i to było naprawdę kłopotliwe mnie. źle, daj mu teraz bash. – MikeT