Timestamp mit DateTime im Etherpaket ?

knopper

Mitglied
DateTime.Now gibt die aktuelle Uhrzeit zurück

Nun möchte ich die Zeitangabe nach UInt32 konvertieren und über Ethnernet schicken.

Ein Beispiel: mit Ethereal kann man ein Datenfeld in einem Etherpaket anzeigen:

Identification: Nov 11, 2004 10:13:52.-660770640

Das Feld ist 64 Bit lang.

die ersten 32 Bits ist die Zeit angabe, die letzten 32 Bits ist ein Randomwert.

Wie kann ich also DateTime.Now nach Byte umwandeln und umgekehrt ?

Gruss
 
Hallo.

Versuch das doch über die Convert-Klasse zu regeln.
Also etwa
Code:
   DateTime dt = Convert.ToUInt32(System.DateTime.Now);  //ist falsch!
   UInt32 myDT = Convert.ToUInt32(System.DateTime.Now); //ist richtig

Gruß, Niko

<edited 17.11.2004, 13:59>
Habe einen syntaktischen Fehler in meinem Code korrigiert.
</edited 17.11.2004, 13:59>
 
Zuletzt bearbeitet:
Hallo, knopper.

Du müsstest dich schon etwas genauer ausdrücken.
Was genau geht denn nicht? Gibt der Compiler irgendeine spezifische Fehlermeldung aus?
Hast du alles in ein try-catch-Konstrukt gepackt, damit er eine detailierte Meldung bringen kann? :confused:
Zeig' doch bitte auch mal den Codeblock, in dem du versuchst, das zu benutzen.

Gruß, Niko
 
Hallo Niko,
Alles was ich wachen will, ist diese C - Code:

// high-order 32 bits: time in seconds from year 1900,
// low-order 32 bits: fractional seconds (1/256 sec resolution,
// i.e., 8 bits, used) and the last bits random

int new_reg_time;
unsigned int new_reg_rand;
static int last_reg_time = 0;
static unsigned int last_reg_rand = 0;
struct timeval tv;

.......


gettimeofday(&tv, NULL);
new_reg_time = tv.tv_sec + mn.clock_correction;
new_reg_rand = ((tv.tv_usec * 256 / 1000000) << 24) |
(get_rand32() & 0xffffff);
if (new_reg_time == last_reg_time &&
new_reg_rand <= last_reg_rand)
{
new_reg_rand = last_reg_rand + 1;
}
req->id[0] = htonl(new_reg_time + UNIX_NTP_DIFF);
req->id[1] = htonl(new_reg_rand);
last_reg_time = new_reg_time;
last_reg_rand = new_reg_rand;


nach C# umzuwandeln.

Ich habe im Internet das hier gefunden:

TimeSpan ts = DateTime.Now - new DateTime( 1970, 1, 1 );
UInt32 m_new_reg_time = (UInt32)ts.TotalSeconds;

bin aber nicht sicher ob es richtig ist. Ausser Random lässt sich auch nicht einfach nach UInt32 umzuwandeln.

Gruss
 
Hallo, knopper.

Sorry für den Syntaxfehler in meinem früheren Posting, den hab' ich inzwischen korrigiert.
Den Code-Schnipsel, den du im Netz gefunden hast, hab' ich mal versucht zu kompilieren, und das klappt auch: :)
Code:
       TimeSpan ts = DateTime.Now - new DateTime( 1970, 1, 1 );
       UInt32 m_new_reg_time = (UInt32)ts.TotalSeconds;
       lblMyLabel.Text += Convert.ToString(m_new_reg_time);
Damit erstellst du dir ein Zeitintervall vom 1.1.1970 bis zum heutigen Tag.
Wenn du dir das Ergebnis als String ausgeben lässt, bekommst du nun also "1100698269", was obigem Zeitintervall in Sekunden entspricht (~60*60*24*365*34 s).
Durch (UInt32) machst du einen TypeCast, du erzwingst also, dass ts.TotalSeconds als "Unsigned Integer 32 Bit"-Wert in der Variable m_new_reg_time gespeichert wird.
Ist es nicht das, was du möchtest? :)
Wenn du etwas anderes meintest, versuch' es spezifisch auszudrücken.

Gruß, Niko

P.S.: Benutz' doch bitte die Code-Tags, das macht den Code leserlicher... ;)
 
Zuletzt bearbeitet:
Danke Niko,

wie kann ich m_new_reg_time wieder in Uhrzeitformat umwandeln? und zeigen lassen wie z.B. Nov 11, 2004 10:13:52.-660770640 ?

Gruss
 
Ich habe im web das hier gefunden:

public DateTime ReadDateTime(Int64 value) {

return DateTime.FromBinary(value);

}

Ich habe auf meinem Rechner existiert die Methode FromBinary nicht.
Habe ich etwa die alte .Net version ?
 
Hallo.

Mein .NET-Framework (V1.1) kennt das auch nicht. Bist du sicher, dass das Beispiel für .NET ist? Das ganze sieht für mich außerdem aus, wie eine Property für einen privaten Member.
Kann dir ansonsten leider auch nicht weiterhelfen, da ich mich bisher nicht mit dem Problem des Zurückumwandelns von Sekunden in ein Datum beschäftigt habe.
Mein (leider ebenfalls erfolgloser) Versuch taugt leider nur für Zeitreisen in die Vergangenheit (ins Jahr 34).
Es wird irgendwie richtig gezählt, aber wohl falsch ausgegeben (Von 1970 bis 2004 sind es wohl 34 Jahre).
Hier also mal die unreife Frucht meines Nachmittags...
Code:
    try
  {
     TimeSpan ts = DateTime.Now - new DateTime( 1970, 1, 1 );
     long m_new_reg_time = ts.Ticks;
     lblConsole.Text += "Aktuelles Datum und Uhrzeit: "+DateTime.Now+"<br>";
     lblConsole.Text += "Ticks seit 1.1.1970:"+Convert.ToString(m_new_reg_time)+"<br>";
       DateTime dt = new DateTime(m_new_reg_time);
       dt = Convert.ToDateTime(dt);
       lblConsole.Text += "Datum heute: "+Convert.ToString(dt);
   }
  catch(Exception ex)
  {
     lblConsole.Text += ex.Message;
  }
Aber vielleicht kannst du ja meinen "Gedankenmüll" recyclen. :)
Eine letzte Idee wäre vielleicht noch, dass du alles "zu Fuß" zurückrechnest.

Gruß, Niko

P.S.: Ein Tick sind 100 Nanosekunden.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück