Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Skype Timestamp format (https://www.delphipraxis.net/132958-skype-timestamp-format.html)

semo 22. Apr 2009 19:42


Skype Timestamp format
 
Dies ist der Auszug aus einer chatmsg256.dbb. Gelistet ist hier genau ein Record der Länge 264 Bytes.

6C 33 33 6C 93 00 00 00 16 00 00 00 41 0C 00 09 09 03 E0 03 23 6D 61 72 63 75 73 68 61 73 73 6D 61 6E 6E 2F 24 61 7A 61 6C 69 73 38 33 3B 62 62 30 33 62 38 66 35 39 64 65 39 36 63 39 34 00 00 E5 03 BD A8 88 CF 04 03 E8 03 6D 61 72 63 75 73 68 61 73 73 6D 61 6E 6E 00 03 EC 03 6D 61 72 63 75 73 68 61 73 73 6D 61 6E 6E 00 00 81 04 02 00 0B A3 EB AA E5 04 00 07 D7 B2 AB 48 03 FC 03 6A 75 68 75 00 00 F1 03 03 00 03 A3 EB AA E5 04 03 D8 18 61 7A 61 6C 69 73 38 33 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Der Timestamp steht an Offset 66 (davor stehen die drei bytes 00 E5 03)
Es handelt sich hier also um die Werte BD A8 88 CF 04.
Laut dieser URL (Seite 4 oben) besteht der Timestamp aus 5 Bytes?! Nach der Anleitung komme ich aber nicht auf den hier angeblich hinterlegten TDateTime Wert von "12.04.2009 18:18:05".

Hat jemand eine Idee?
Meines Wissens ist Skype ja auch mit Delphi geschrieben. Warum sollten die Entwickler vom Standard TDateTime Wert Handling abweichen?
Ich frage mich also ob die Angaben in dem genannten PDF stimmen.

jfheins 22. Apr 2009 20:11

Re: Skype Timestamp format
 
Da steht doch:
Zitat:

Time stamp
The timestamps in records are stored in the standard UNlX format of seconds since 1/1/1970
00:00:00. However the data isn't represented as the standard 4 byte unsigned integer as is
usually the case, instead using 5 bytes to represent the timestamp with the format below
(where 'd' indicates a bit of data):

0000dddd 1ddddddd 1ddddddd 1ddddddd 1ddddddd

Stripping the leading 0's from this and removing the '1' at the most significant bit or each byte
yields 32 bits of information. If these are concatenated into 4 bytes, the number can be
handled using standard time functions. It is unknown why this format has been chosen.
Du musst also die Bits entsprechend zusammenfrickeln und darauf auchten, dass es keine Delphi-Zeit ist, sondern Unix-Timestamp.

Evtl. sind die Bytes auch umgedrecht - weil das hinterste rote Byte vorne ein 0-Nibble hat isses wahrscheinlich das erste Bytes des Zeitstempels ;)

Warum die Entwickler davon abweichen kann viele Gründe haben. Einer ist vielleicht, dass es andere nicht so einfach haben, die Daten auszulesen ;)

Probiers mal so in etwa: (Daten aus deiner Datei genommen)

Wert: Cardinal = 0;
Wert := Wert or BD;
Wert := Wert or A8 shl 7;
Wert := Wert or 88 shl 14;
Wert := Wert or CF shl 21;
Wert := Wert or 04 shl 28;
Zeit : TDatetime = UnixToDatetime(Wert);

nicodex 23. Apr 2009 09:19

Re: Skype Timestamp format
 
Das Format sieht nach folgender "Idee" aus:
7 Bits Daten
1 Bit (MSB) Flag (1 = ein weiteres Byte einlesen)

So lassen sich kleine Integer-Werte platzsparend speichern (0..127 = 1 Byte).

Beispiel zum Lesen eines 32-Bit Integers (mit Datenzeiger und (restlicher) Datengröße als Parameter):
Delphi-Quellcode:
function ReadLong(var AData: Pointer; var ASize: Cardinal): LongWord;
var
  Index: Integer;
  Value: Byte;
begin
  Result := 0;
  Index := 0;
  repeat
    if ASize = 0 then
      raise EReadError.CreateRes(PResStringRec(@SReadError));
    Value := PByte(AData)^;
    if (Value and $7F) <> 0 then
    begin
      if (Index >= 32) or ((Index >= 28) and ((Value and $70) <> 0)) then
        raise EIntOverflow.CreateRes(PResStringRec(@SIntOverflow));
      Inc(Result, (Value and $7F) shl Index);
    end;
    Inc(Index, 7);
    Inc(PByte(AData));
    Dec(ASize);
  until Value and $80 = 0;
end;

Bernhard Geyer 23. Apr 2009 09:27

Re: Skype Timestamp format
 
Zitat:

Zitat von nicodex
Das Format sieht nach folgender "Idee" aus:

Ist keine "Idee", ist ein gebräuchlicher Standard: ASN.1

nicodex 23. Apr 2009 10:03

Re: Skype Timestamp format
 
Zitat:

Zitat von M. Hassmann
Nach der Anleitung komme ich aber nicht auf den hier angeblich hinterlegten TDateTime Wert von "12.04.2009 18:18:05".

Das ist die lokale Zeit, gespeichert wurde "12.04.2009 16:18:05".

semo 23. Apr 2009 18:03

Re: Skype Timestamp format
 
danke erst einmal für die hinweise.
ich hoffe ich komme am wochenende mal dazu mir das genauer anzusehen.

grüße an dich nico(dex) - lang nix mehr voneinander gehört :hi:

semo 25. Apr 2009 14:33

Re: Skype Timestamp format
 
okay, ich habe den richtigen wert auslesen können.
vielen dank an alle.

nicodex 27. Apr 2009 09:05

Re: Skype Timestamp format
 
Zitat:

Zitat von M. Hassmann
lang nix mehr voneinander gehört :hi:

Wie immer, viel zu tun :hi:
Zitat:

Zitat von M. Hassmann
ich habe den richtigen wert auslesen können.

Na dann viel Erfolg mit den Skype-Logs.

semo 27. Apr 2009 09:14

Re: Skype Timestamp format
 
ChatMsg***.dbb Dateien habe ich damit erledigt, am Wochenende auch die Transfer***.dbb Dateien.
Es läuft also :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz