Co to za format daty w hex (\0\0\0\x10\0#ÂĽU\0\0\0\0Ăż)?

0

Witam.

Problematyczne formatowanie daty pochodzi z programu ChomikBox. Program w takim formacie zapisuje w pliki INI datę ostatniej modyfikacji pliku. Zrobiłem kilka prób, ale do niczego konkretnego nie doszedłem. Zauważyłem jedynie, że jeżeli zmienię datę o jeden dzień, to wartość hex w danej pozycji zmieni się o jeden krok. Ale zmiana daty o miesiąc lub rok, wywołuje już zupełnie nieoczekiwane zmiany w hex. Na obecna chwilę nie potrafię tego ogarnąć i dlatego proszę Was o pomoc.

Poniżej zamieszczam przykładowe dane z pliku INI (lokalizacja pliku User[zalogowany użytkownik]\AppData\Local\ChomikBox dla Win7).
Trzy linijki w których jest data wyglądają tak:

extraKeys=__privateModificationDate, modificationDate
userdata-__privateModificationDate=@Variant(\0\0\0\x10\0#¼U\0\0\0\0ÿ)
userdata-modificationDate=@Variant(\0\0\0\x10\0#¼U\0\0\0\0ÿ)

1700-01-01 00-00
28 5c 30 5c 30 5c 30 5c 78 31 30 5c 30 23 c2 bc 55 5c 30 5c 30 5c 30 5c 30 c3 bf 29 (\0\0\0\x10\0#ÂĽU\0\0\0\0Ăż)
1700-01-10 00-00
28 5c 30 5c 30 5c 30 5c 78 31 30 5c 30 23 c2 bc 5e 5c 30 5c 30 5c 30 5c 30 c3 bf 29 (\0\0\0\x10\0#ÂĽ^\0\0\0\0Ăż)
1701-01-10 00-00
28 5c 30 5c 30 5c 30 5c 78 31 30 5c 30 23 c2 bd c3 8b 5c 30 5c 30 5c 30 5c 30 c3 bf 29 (\0\0\0\x10\0#½Ë\0\0\0\0ÿ)
1900-01-01 00-00
28 5c 30 5c 30 5c 30 5c 78 31 30 5c 30 24 c3 99 c2 ad 5c 30 5c 30 5c 30 5c 30 c3 bf 29 (\0\0\0\x10\0$Ù­\0\0\0\0ÿ)
1900-01-02 00-00
28 5c 30 5c 30 5c 30 5c 78 31 30 5c 30 24 c3 99 c2 ae 5c 30 5c 30 5c 30 5c 30 c3 bf 29 (\0\0\0\x10\0$Ù®\0\0\0\0ÿ)
1900-01-03 00-00
28 5c 30 5c 30 5c 30 5c 78 31 30 5c 30 24 c3 99 c2 af 5c 30 5c 30 5c 30 5c 30 c3 bf 29 (\0\0\0\x10\0$Ù¯\0\0\0\0ÿ)
1900-02-02 00-00
28 5c 30 5c 30 5c 30 5c 78 31 30 5c 30 24 c3 99 c3 8d 5c 30 5c 30 5c 30 5c 30 c3 bf 29 (\0\0\0\x10\0$ÙÍ\0\0\0\0ÿ)
1901-01-01 00-00
28 5c 30 5c 30 5c 30 5c 78 31 30 5c 30 24 c3 9b 5c 78 31 61 5c 30 5c 30 5c 30 5c 30 c3 bf 29 (\0\0\0\x10\0$Ă›\x1a\0\0\0\0Ăż)
2009-03-26 09-28-00
28 5c 30 5c 30 5c 30 5c 78 31 30 5c 30 25 75 c2 85 5c 78 32 5c 62 5c 78 35 5c 30 c3 bf 29 (\0\0\0\x10\0%uÂ…\x2\b\x5\0Ăż)
2009-03-26 09-28-01
28 5c 30 5c 30 5c 30 5c 78 31 30 5c 30 25 75 c2 85 5c 78 32 5c 62 5c 62 c3 a8 c3 bf 29 (\0\0\0\x10\0%u…\x2\b\bèÿ)
2009-03-26 09-29-01
28 5c 30 5c 30 5c 30 5c 78 31 30 5c 30 25 75 c2 85 5c 78 32 5c 62 c3 b3 48 c3 bf 29 (\0\0\0\x10\0%uÂ…\x2\bĂłHĂż)

W razie potrzeby mogę oczywiście wykonać jeszcze jakieś próby z ChomikBox.
Docelowo pod Delphi 7, będę musiał pobrać datę z pliku i zapisać ją w pliku INI w takim właśnie formacie.

0

ale przekombinowałeś!
@Variant(\0\0\0\x10\0#¼U\0\0\0\0ÿ) reprezentuje tekstowo zakodowane dane binarne, a ty przedstawiłeś szesnastkowy zapis tego napisu, co jest nieużyteczne (na dodatek łącznie z nawiasami)!
interesujące dane mają postać:

\0\0\0\x10\0#¼U\0\0\0\0ÿ
00 00 00 10 00 23 bc 55 00 00 00 ff

Uwzględniając kodowanie jeszcze raz przeanalizuj te dane

0

Siedziałem, kombinowałem, szukałem i nic nie wskórałem.

Jeżeli chodzi o dane które ma przetworzyć, czyli ciąg w HEX 00 00 00 10 00 23 bc 55 00 00 00 ff , mam w całości przedstawić w BIN ?
Czy pominąć elementy stałe 00 00 00 10 00 i tylko 23 bc 55 przekształcić na BIN i uzupełnić z przodu o 00 00 00 10 00 ? Trochę to bez sensu, ale takie już moje pokręcone rozumowanie. Chodzi o to, że \0(tekst) to w BIN 00 00 00 00, a 23(HEX) to w BIN 10 00 11 ?

Próbowałem to podpasować pod milisekundy Unix, ale nie wyszło mi. Szukam po Internecie ( http://stackoverflow.com/questions/719129/datetime-hex-format, http://fmdiff.com/fm/timestamp.html, http://www-01.ibm.com/support/docview.wss?uid=swg27003019 itp. itd. ) i wciąż nic mi nie pasuje.

Zrobiłem sobie kolejną tabelkę reprezentującą zmianę dat w HEX (puste miejsca to tylko kosmetyczne przesunięcia):

1700-01-01 00-00-00	23 c2 bc    55       5c 30 5c 30 5c 30 5c 30 c3 bf
1700-01-10 00-00-00	23 c2 bc    5e       5c 30 5c 30 5c 30 5c 30 c3 bf
1701-01-01 00-00-00	23 c2 bd c3 82       5c 30 5c 30 5c 30 5c 30 c3 bf
1701-01-10 00-00-00	23 c2 bd c3 8b       5c 30 5c 30 5c 30 5c 30 c3 bf
1900-01-01 00-00-00	24 c3 99 c2 ad       5c 30 5c 30 5c 30 5c 30 c3 bf
1900-01-02 00-00-00	24 c3 99 c2 ae       5c 30 5c 30 5c 30 5c 30 c3 bf
1900-01-03 00-00-00	24 c3 99 c2 af       5c 30 5c 30 5c 30 5c 30 c3 bf
1900-02-02 00-00-00	24 c3 99 c3 8d 	  5c 30 5c 30 5c 30 5c 30 c3 bf
1901-01-01 00-00-00	24 c3 9b 5c 78 31 61 5c 30 5c 30 5c 30 5c 30 c3 bf
2009-03-26 09-28-00	25 75 c2 85 5c 78 32 5c 62 5c 78 35    5c 30 c3 bf
2009-03-26 09-28-01	25 75 c2 85 5c 78 32 5c 62 5c 62 c3 a8 	  c3 bf  
2009-03-26 09-29-01	25 75 c2 85 5c 78 32 5c 62 c3 b3 48 	     c3 bf   

Niby wartości HEX rosną o jeden wraz z dniem lub rokiem, ale gdy dochodzi do zmiany miesiąca czy roku to już zaczynają się dla mnie dziać niezrozumiałe rzeczy. Sekund i minut całkowicie nie pojmuję co tam się dzieje.

Proszę o kolejną wskazówkę jak mam się do tego zabrać i już się boję jak mi przyjdzie napisać funkcję do tego pod Delphi.

1
  1. masz interpretować tylko to co jest w nawiasach
  2. każdy slash masz traktować jako sekwencje specjalną, np \0 to po prostu bajt zero \x10 to po prostu szesnastkowy zapis 16-tki. Myślałem, że poprzednio się jasno wyraziłem, a widzę, że mnie zignorowałeś.
  3. pozostałe znaki interpretujesz dosłownie (ich wartość binarna to jest to co ci potrzebne).
  4. nie rób kopiuj wklej tych danych, bo z powodu kodowania w wątku tym tracone są istotne dane. Nie wiem jakie kodowanie ma twój plik z tymi danymi, ale nie wygląda mi to na UTF-8 (pewnie Windows-1250 lub coś w ten deseń). Jak to przeklejasz do przeglądarki, to interpretacja krzaczków się zmienia i zmienia się długość danej, użyte jest inne kodowanie i robi się sieczka. Dlatego oddaj te pliki jako dosłowne załączniki! Jeśli masz jakiś hex edytor to może pomóc.
  5. szczerze ten tekstowy zapis danych binarnych wygląda mi na amatorszczyznę (wszystkie wartości powyżej 127 powinny być zapisane jako sekwencja ze slashem np \x9f, właśnie po to by uniknąć problemów z kodowaniem tekstu, w przeciwnym razie edytor tekstowy mógłby popsuć dane)

Jak dla mnie to wygląda tak
na początku masz zawsze \0\0\0\x10 bo typ uniwersalny (wariant), w ten sposób oznacza sobie co w sobie zawiera. Ta wartość pewnie jest oznaczeniem typu czas (data). Kolejne 8 bajtów (przypuszczalnie powinno być zawsze 8 bajtów) to najprawdopodobniej jest timestamp.
Ten jest liczony względem 01/01/1970 @ 12:00am (UTC) więc użyj tej daty do testów (zwróć uwagę na strefę czasową)! Jeśli wyjdą głównie zera to w zasadzie masz gwarancję, że to timestamp.
Dla kontroli zmień ten czas jeszcze o sekundę, dwie, godzinę, dwie, dzień w oba kierunki.

Jeszcze jest inny podstęp, wpisz do pliku taką wartość i zobacz co wyjdzie (czy może będzie błąd):

userdata-modificationDate=@Variant(\0\0\0\x10\0\0\0\0\0\0\0\0)

1 użytkowników online, w tym zalogowanych: 0, gości: 1