Autor |
Beitrag |
Pbg
      
Beiträge: 16
Win 98
D3 Prof.
|
Verfasst: Mi 23.07.03 15:07
Hallo,
weiß jemand wie man diese
Hex Zahlen in Datum umwandelt
85 21 muss 30.06 werden
86 21 muss 01.07 werden
9C 21 muss 23.07 werden
Ich weiss nicht ob das Jahr mitgespeichert ist , wäre sonst 2003 oder 03
MfG
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 23.07.03 15:37
Was verstehst du unter "intern" wandele das datum in einen String um (DateToStr) und speichere das ab.
|
|
Pbg 
      
Beiträge: 16
Win 98
D3 Prof.
|
Verfasst: Mi 23.07.03 16:59
Hallo,
Danke für deine Antwort.
Mit intern meine ich ( wenn ich mir die Datei im Hex-Editor ansehe)
dort sehe ich die vorher aufgeführten Daten, durch Tests weiss ich das die 2 Byte das Datum
sind. Das möchte ich mir dann Anzeigen lassen.
Das ist die gleiche Datei wie hier:
http://www.delphi-forum.de/viewtopic.php?t=13543&sid=1609552aa48f4c1eac4b12aa55d9629d
habe nun fast alles bis auf das Datum :o))
MfG
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 23.07.03 17:07
Dann wird es keine Plaintext-Datei sein, sondern eine typisierte oder so. Und die kannst du nur gescheit auslesen, wenn du deren Struktur kennst.
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Mi 23.07.03 17:11
Sinnvoll wäre es vielleicht zu wissen, welches Dateiformat das sein soll.
I.d.R. zu erkennen an der Dateiendung 
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
Pbg 
      
Beiträge: 16
Win 98
D3 Prof.
|
Verfasst: Mi 23.07.03 19:03
Hallo,
THX! ich kenne die Daten die in der Datei sein müssen, nur musste ich suchen an welcher Stelle sie in der Datei gespeichert sind, wie gesagt das meiste habe ich schon gefunden und funktioniert auch, lasse mir die eingelesenen Daten über Edit Femster anzeigen. Die Datei wird über ein altes Dos Programm erstelllt. In der Datei sind Char, INT, Byte und BCD Felder. Das Dateiformat ist .dat! Ich brauchte eine Funktion die mir zb. aus
HEX 85 21 (2 Byte) den 30.06 macht und aus 9C 21 muss 23.07 werden
MfG
|
|
Brueggendiek
      
Beiträge: 304
Win 98, Win98SE, Win XP Home
D5 Std
|
Verfasst: Mi 23.07.03 23:38
Hallo pbg!
Sind Deine Beispiele echt oder frei erfunden?
Wenn ich $219C - $2185 rechne, bekomme ich dezimal 23 raus, und das ist ja wohl die Differenz der Tage.
Also zunächst mal: Werte tauschen und in Integer umwendeln, z.B.:
Delphi-Quelltext 1:
| zahl := StrToInt ('$' + satz [ 2 ] + satz [ 1 ]); |
wenn die beiden Bytes in der Stringvariablen "satz" stehen.
Jetzt muß man noch den Basispunkt der Zeitangabe finden, also ausrechnen, welcher Tag als 00 00 gespeichert würde. Diesen Punkt in Relation zum Startpunkt der Delphi-Rechnung (30.12.1899) setzen, einen Korrekturwert herausbekommen und ein Delphi-kompatibler Datumswert ist fertig.
Delphi-Quelltext 1: 2: 3: 4: 5:
| const korrektur = ???;
ausgabedatum := DateToString (zahl + korrektur); |
Gruß
Dietmar Brüggendiek
|
|
Pbg 
      
Beiträge: 16
Win 98
D3 Prof.
|
Verfasst: Do 24.07.03 15:52
Hallo
thx für Deine Antwort. Die Idee scheint super :o) Die Daten sind echt. bekomme aber ein Fehlermeldung beim Konvertieren. habe es jetzt so vereinbart:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| implementation type preise = packed record artikelnummer : ARRAY[0..12] OF CHAR; Datum : ARRAY[0..1] OF CHAR; aek1 : ARRAY [0..5] of byte; avk2geb : ARRAY [0..5] of byte; avk2ein : ARRAY [0..5] of byte; avk1geb : ARRAY [0..5] of byte; avk1ein : ARRAY [0..5] of byte; bek2 : ARRAY [0..5] of byte; bvk2geb : ARRAY [0..5] of byte; bvk2ein : ARRAY [0..5] of byte; bvk1geb : ARRAY [0..5] of byte; bvk1ein : ARRAY [0..5] of byte; unbestimmt95 : ARRAY [1..53] of char; end ; . . . . . datums : string; datumi : integer;
datums := aktdatensatz1.datum[1]+'h' + aktdatensatz1.datum[0]+ 'h'; |
Hier kommt der Fehler (in dem String steht dann nicht z.b. 9c sondern Sonderzeichen)
datumi := strToint (datums);
Kann man bei delphi hex declarieren? Wie greift man auf ein Halbbyte zu?
MfG
Moderiert von tommie-lie: Delphi-Tags hinzugefügt
|
|
Brueggendiek
      
Beiträge: 304
Win 98, Win98SE, Win XP Home
D5 Std
|
Verfasst: Do 24.07.03 22:30
Hallo Pbg!
Leider habe ich etwas nicht so ganz richtig angegeben.
Andererseits hast Du auch meinen (fehlerhaften) Vorschlag nicht richtig übernommen!
Pbg hat folgendes geschrieben: | Delphi-Quelltext 1:
| datums := aktdatensatz1.datum[1]+'h' + aktdatensatz1.datum[0]+ 'h'; | |
Das ist noch falscher.
Leider sind die Werte keine Sedezimalzahlen, sondern Word-Werte! Zur Erklärung für das, was da vor sich geht: Motorola-Prozesoren speichern Werte mit mehreren Bytes so ab, daß das höchste Byte an die niedrigste Stelle kommt (so wie wir beim Schreiben von 1234 ja die 1 als Tausender haben). INTeL-Prozessoren arbeiten genau umgekehrt - sie speichern das niedrigste Byte zuerst (die obendenannte Zahl würde in INTeL also theoretisch 4321 gepeichert). Beide Speicherformen kann man logisch begründen - wir müssen damit leben.
Da hier offensichtlich das obere Byte an der höheren Adresse steht, liegt eine Speicherung im INTeL-Format vor. Wenn Du Deinen Code nicht auch für Motorola (Mac) kompatibel gestalten willst, reicht es also,
Delphi-Quelltext
in den Record zu schreiben und gut is! Die ganze Umwandelei in datums und datumi (warum Integer - ist doch nur 2 Byte und ohne Vorzeichen - sorry, ich habe noch auf Maschinen mit 4 MEGA-Byte RAM geproggt und spare deshalb immer noch gerne) ist dann nicht mehr nötig.
Den Versatz gegenüber der Delphi-Datumsgebung (Wert für Korrektur) rechne Dir bitte selber aus.
Gruß
Dietmar Brüggendiek
|
|
Pbg 
      
Beiträge: 16
Win 98
D3 Prof.
|
Verfasst: Do 24.07.03 23:07
Hallo,
Danke für den Tip. Ich bin nicht auf den Gedanken gekommen es als Word zu declarieren. Eben Dooof :o))) Habe schon ewig nichts mehr programmiert, das letzte mal vor 10 Jahren PL1 mit BS 2000. Da ist eben alles weg, fange wieder von vorn an :o)
Das war mein Ergebnis nach Stundenlanger Arbeit, funktionierte aber auch :o)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| const korrektor := 102269; datums:='$'; datums := datums + Format('%*.*X', [2, 2, (aktdatensatz1.datum[1])]) ; datums := datums + Format('%*.*X', [2, 2, (aktdatensatz1.datum[0])]) ; datumi := strToint (datums); ausgabedatum := DateToStr (datumi + korrektur); edit23.text := ausgabedatum; |
Nun kann ich mir die paar Zeilen sparen :o) Klappt jetzt super :o))
MFG
Moderiert von UGrohne: Delphi-Tags eingefügt
|
|
ShadowThief
      
Beiträge: 278
|
Verfasst: Fr 25.07.03 11:27
da denkt man, dass man jetzt mal n weng programmiert, nach 10 jahren
und dann kommt sowas
naja. delphi und datum is eh so ne sache, eine der wenigen dinge,
die ich jetzt echt nich so prickelnd finde.
|
|
Pbg 
      
Beiträge: 16
Win 98
D3 Prof.
|
Verfasst: Fr 25.07.03 14:24
Hallo,
ich habe gelogen es sind genau 12 Jahre :O))
Aber irgendwann nach vielen Fragen, kann ich auch ein wenig Delphi :o))
MfG
|
|