Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#12

Re: Paradox Currency Feld umschlüsseln?

  Alt 9. Feb 2006, 07:19
Guten Morgen, Mitchl.

Kennst du eigentlich diese Website: klick ?

Mit den Informationen von dort lese ich deine drei Werte ein und zeige sie an:

Delphi-Quellcode:
procedure SwapBytes(var buffer; size: word);
var
  b: byte;
  pbIn, pbOut: PByte;
begin
  pbIn := @buffer;
  Inc(pbIn, size - 1);
  pbOut := @buffer;
  while cardinal(pbIn) > cardinal(pbOut) do begin
    b := pbOut^;
    pbOut^:= pbIn^;
    pbIn^ := b;
    Dec(pbIn);
    Inc(pbOut);
  end;
end;

procedure SwitchHighBit(var buffer);
begin
  Byte(buffer) := Byte(buffer) xor $80;
end;

function ParadoxDate(days: Cardinal): Integer;
const
  REF1900 = 693594;
begin
  Result := days - REF1900;
end;

procedure ReadValues(fn: TFileName; offset: Cardinal);
var
  fs: TFileStream;
  s: String;
  d: Double;
  c: Cardinal;
begin
  fs := TFileStream.Create(fn, fmOpenRead, fmShareDenyWrite);
  fs.Position := offset;

  // 20 Bytes einlesen
  SetLength(s, 20);
  fs.Read(s[1], Length(s));
  // bei trailing 0 abschneiden
  s := PChar(s);
  ShowMessage(Format('string = "%s"', [s]));
 
  // 8 byte currency value einlesen
  fs.Read(d, SizeOf(d));
  // highbit umkehren
  SwitchHighBit(d);
  // byte order umkehren
  SwapBytes(d, SizeOf(d));
  ShowMessage(Format('double = "%f"', [d]));

  // 4 byte date einlesen
  fs.Read(c, SizeOf(c));
  // highbit umkehren
  SwitchHighBit(c);
  // byte order umkehren
  SwapBytes(c, SizeOf(c));
  // Zahl der Tage seit der Zeitrechnung
  ShowMessage(Format('paradox date = "%d"', [c]));
  // Umwandeln nach Delphi Date
  ShowMessage(DateToStr(ParadoxDate(c)));

  fs.Free;
end;
marabu
  Mit Zitat antworten Zitat