 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Janek76
Anmeldungsdatum: 13.08.2005 Beiträge: 2
|
Verfasst am: 13.08.2005, 14:26 Titel: Datumsvariablen?-bräuchte mal Eure Hilfe |
|
|
Hallo liebes Forum,
ich habe folgendes Problem und würde mich sehr freuen, wenn mir jemand weiterhelfen könnte: Ich möchte Anwenderdaten aus einer alten DOS-Anwendung herausziehen, die die Anwendung einfach in Dateien geschrieben hat und Ihnen den Namen .DAT gegeben hat. Die meisten Felder eines Datensatzes bestehen aus ASCII-Code, der sich ja ziemlich einfach auslesen läßt. Zum Teil sind aber auch Numerische-Felder dabei. Probleme bereitet mir da besonders das Datumsformat: Laut Hex-Editor erkenne ich ein 2byte Datumsfeld das die Hex-Werte 0x03 25h hat und dem 09.09.1999 entspricht. Ich habe lange gegoogelt und die Hilfe-Dateien des QB-Editors durchgesehen, aber alles was ich gefunden habe, waren die $DATE-Funktion, die mir das Datum als String zurückgibt, was ich ja nicht gebrauchen kann, und das date-Statement zum Ändern der Systemzeit. Aber ich habe keine Ahnung, ob es einen Datumsvariablentyp von 2byte gibt, wie ich ihn deklarieren und speichern kann. Ich kenne mich mit qbasic leider nicht aus. Hat irgendjemand eine? Ich würde mich sehr freuen, wenn mir jemand weiterhelfen kann.
Außerdem habe ich noch eine kleine Frage, über etwas worüber ich mich gewundert habe: Wenn ich die LONG-Zahl 6666666 nehme, und sie in einer Datei abspeichere, zeigt mir der Hex-Editor AA B9 65 an, wenn ich im QB-Editor hingegen PRINT HEX$(6666666) schreibe, wird alles umgedreht und es kommt 65 B9 AA heraus. Warum das? Was hat es damit auf sich?
Gruß,
Jan |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 13.08.2005, 16:45 Titel: |
|
|
Unter QBX PDS 7.1 (downloadbar unter http://www.antonis.de/qbdown/qbcompil.htm , siehe auch www.qbasic.de) gibt es die Funktion DateSerial#, die ein Datum in genau das Format Packt, das du beschrieben hast. Mit DateValue# kannst du sie wieder zurückverwandeln.
Um diese Funktionen verwenden zu können, musst du aber die LIB DTFMTAR laden. das geht, indem du QBX mit der Zeile
QBX /L DTFMTAR.QLB
ausführst.
(achtung, das funktioniert nur mit QBX 7.1!)
Außerdem brauchst du die Libs selbst dazu... ich bin mir nicht mehr ganz sicher, ob in dem Download-Archiv, das ich oben angegeben habe auch die LIB dabei ist... ich habe meine version von QBX von der HP eines der Member dieses Forums, der die Original-Disketten von QBX in ein ZIP-Archiv gepackt hat... da war alles dabei....
However, dieser Hilfe-Auszug könnte dir Helfen:
Auszug aus der QBX-Hilfe, Kapitel "Serial Numbers"
Code: |
A serial number is a date/time code used by BASIC to represent dates and
times between January 1, 1753 and December 31, 2078.
■ Numbers to the left of the decimal point represent the date;
numbers to the right of the decimal point represent the time. For
example:
This serial number Represents this date
══════════════════ ═════════════════════════
20323.25 August 22, 1955 6:00 AM
20324.25 August 23, 1955 6:00 AM
367.5 January 1, 1901 12:00 PM
367.75 January 1, 1901 6:00 PM
■ A serial number with no fractional part represents a date only. A
serial number with only a fractional part represents a time only.
■ The date portion of the serial number (to the left of the decimal
point) can represent dates ranging from January 1, 1753, through
December 31, 2078. Dates before December 30, 1899 are represented
by negative numbers; dates after December 30 are represented by
positive numbers:
This serial number Represents this date
══════════════════ ════════════════════
-1 December 29, 1899
0 December 30, 1899
1 December 31, 1899
2 January 1, 1900
■ The time portion of the serial number (to the right of the decimal
point) can represent times that range from 0 (00:00:00 AM) to
.99999 (11:59:59 PM or 23:59:59).
The following date/time functions return a serial number value:
◄DateSerial#► ◄Month&► ◄TimeSerial#► ◄Hour&►
◄DateValue#► ◄Weekday&► ◄TimeValue#► ◄Minute&►
◄Year&► ◄Day&► ◄Now#► ◄Second&► |
Wenn dich die anderen Kapitel, die hier nur als Verweise aufgeführt sind auch interessieren, schreib bitte nochmal, ich poste sie dann... oder schicke dir einfach das komplette HLP-Verzeichnis von QBX.
Was das Zahlenformat angeht:
HEX$ verwandelt Dezimalzahlen so in Hex, wie wir Menschen sie auch behandeln würden: Die höherwertigen Stellen zuerst, dann die minderwertigen. (Im dezimalsystem also zuerst die Hunderter, dann die Zehner, dann die einser. Im Hex-Sys dementsprechend erst die 256'er (&hFF), dann die 16'er (&hF) )
In der Datei ist es aber genau anders herum.
Das liegt an einigen Standards, die in den guten alten Zeiten eingeführt wurden, als ASM noch eine gängige Sprache war. Das speichern und Laden von Zahlen ist so anscheinend leicher zu bewerkstelligen, jedenfalls ist es ein allgemein anerkannter Standard, was dazu führt, dass binäre Daten leichter portierbar sind...
However, akzeptiere einfach, dass HEX$ die werte genau anders herum ausgibt, als sie gespeichert werden  _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
Janek76
Anmeldungsdatum: 13.08.2005 Beiträge: 2
|
Verfasst am: 15.08.2005, 01:03 Titel: |
|
|
Hi Dusky_Joe,
vielen Dank, daß Du Dir Mühe gemacht hast, das zu posten. Das ist genau das, wonach ich gesucht habe. Ich habe wirklich stundenlang googelt, ohne was vernünftiges gefunden zu haben. Deine Antwort ist echt eine große Hilfe. Ich muß noch mal sehen, welchen Hex-Code ich genau für die Daten habe und hoffe, daß ichs konvertieren dann. |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 16.08.2005, 12:58 Titel: |
|
|
Freut mich zu hören
Und nichts zu danken, in einer Community hilft man, wenn man kann
Mir waren die Schlüsselwörter vom durchstöbern der Hilfe bekannt. Ich hab sie mir jetzt nochmal durchgelesen, und viola - es passt
Ich würde aber nicht versuchen, vom Hex direkt aufs datum zu kommen, sondern erst mal über dezimal zu gehen.
Du könntest...
- Die Datei FOR BINARY öffnen,
- Vom Entsprechenden Offset 8 (!) Bytes in eine DOUBLE-Variable einlesen (eine Double-Variable hat immer 8 Byte)
- Mit CINT den Nachkommateil abschneiden. Dann hast du genau den Teil der Variablen, die das Datum darstellt, der Nachkommateil stellt ja die Uhrzeit dar. Evtl solltest du CLNG verwenden, da mit einem QB-INTEGER nur 65536 Werte dargestellt werden können. 65536 Tage sind etwa 180 Jahre. In einer LONG-Variable hingegen lassen sich weitaus mehr Werte speichern (2 ^ 32), was die 325 Jahre ermöglicht, die in diesem Format anscheinend dargestellt werden können. (01-01-1753 - 31-12-2078)
Also:
Code: | DIM Serial AS DOUBLE
DIM Datum AS LONG
OPEN "deineDatei" FOR BINARY AS #1
GET #1, Offset, Serial
Datum = CLNG(Serial) |
Das genaue Datum kannst du dann auf verschiedene Wege ermitteln. Im Internet gibt es bereits einige Zeitraum-zu-Datum-Wandler, auch für QB. Sie mal auf qbasic.de. Wenn du dir selbst einen schreiben willst, achte auf Schaltjahre!
Viel Spaß dabei!
Und aus reinem Interesse, poste doch bitte den fertigen Code auch, mich interessiert, ob's funktioniert
Have a nice day
Ciao _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|