Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Hilfe bei Algorithmus (https://www.delphipraxis.net/98641-hilfe-bei-algorithmus.html)

Newbie44 30. Aug 2007 11:59


Hilfe bei Algorithmus
 
Hallo,

ich hab eine kleine Binärdatei in der sind kodierte zahlen drinnen

Umrechnung der Koordinaten:

- Die Zahl muss gedreht werden (da Little Endian) 00 00 05 00 --> 00 05 00 00
- Aufteilung in Zahl und Mantisse, z. B: Zahl: 00 05 Mantisse: 00 00
- einzelnes Ausrechnen der Zahl und der Mantisse

Besonderheiten Mantisse:

Von Dezimal nach Hexadezimal

Bei der Zahl 0,632 sitzt die 6 auf der Zehntelstelle, die 3 auf der Hunderstelstelle und die 2 auf der Tausendstelstelle. Ein Zehntel ist 10-1, ein Hundertstel 10-2 usw.

Das wäre Dann 0,A1CA oder im format CA A1 00 00

und Umgekehrt:

Arbeite die Ziffern nach dem Komma von rechts nach links ab.
Multipliziere die Ziffern mit wachsenden Potenzen der Basis, angefangen mit
16° = 1, und summiere die Produkte:

Code:
     10 •     1 =    10
     12 •    16 =   192
      1 •   256 =   256
     10 •  4096 = 40960
                  ——————
                           41418

Teile dann diese Summe durch die nächste Potenz der Basis 16:

41418 : 65536 = 0,631988525390625

und addiere den bereits ermittelten ganzzahligen Anteil 0:

Code:
    0,631988525390625
  + 0
   ——————————————————
    0,631988525390625
Negative Koordinaten:

Die Negativen Daten liegen codiert vor. Sie beginnen jeweils mit einen F oder im Binärsystem ist die höchstmögliche Stelle eine 1.

Von der Zahl wird FF FF FF FF abgezogen,

Wenn z. B. die Zahl

4076C5FF vorliegt dann wird Little Endian angewendet FF C5 76 40

wir ziehen von der Zahl nun FFFF FFFF ab

Code:
FF FF FF FF
-   FF C5 76 40
00 3A 89 BF

Die Zahl 3A, 89 BF wird nun umgewandelt.

Das ergibt dann.

58,538070678710937

Da es aber eine Minuszahl ist muss noch x -1 genommen werden

Aufgerundet sieht das Ergebnis dann so aus:

-58,538


Hier ist ein Ausschnitt der Datei:

Code:
3A000000C22E68023711570255384602298A3502965624021B7D0F024C66FA01C6AFE801AEFFD80129A3CA0149D6B901601CA8011DDB99011D9B8C0115FF7E018CD67601C8E76D01039F6501D53F5B017C5D530161814A
Das erste DWORD sagt mir, wie viele Koordinaten drinnen stehen (Multiplizieren mal 3, da es 3 koordinaten für einen Punkt gibt)

Nur wie programmiere ich jetzt das umrechnen von diesen korrdinaten?

Den Rechenweg hab ich ja bereits beschrieben

Ich hoffe Ihr könnt mir beim Algorithmsu helfen

Gruß

Sebastian

sirius 30. Aug 2007 12:10

Re: Hilfe bei Algorithmus
 
Und es ist nicht einfach nur Single?
Ich meine: Wer kocht denn schon mit einem eigenen Format?

Newbie44 30. Aug 2007 12:14

Re: Hilfe bei Algorithmus
 
Da gibt es einiges. Aber ich hab eben dieses Zahlenformat umzurechnen. du kannst auch gerne probieren wie du anders zum ergebnis kommst. aber eigentlich ist diese form vom zahlenspeichern normal nicht üblich, aber wird halt hier benutzt. ich möchte halt das format verarbeiten

sirius 30. Aug 2007 12:21

Re: Hilfe bei Algorithmus
 
Aha,
du musst einfach nur die 4 Bytes nehmen und das ganze durch 2^16 = 65536 teilen, fertig.

Newbie44 30. Aug 2007 12:23

Re: Hilfe bei Algorithmus
 
aha danke, kommt dann als datentyp wohl ein single raus?

negaH 30. Aug 2007 12:25

Re: Hilfe bei Algorithmus
 
Das ist simples Festkomma Format im 2'er Komplementär, 16:16.

Delphi-Quellcode:
function ToDouble(Value: Integer): Double;
 
  function Swap(Value: Integer): Integer; // swap Endianess
  asm
    BSWAP EAX
  end;

begin
  Result := Swap(Value) / $10000; // Fixpoint 16:16
end;
Gruß Hagen

sirius 30. Aug 2007 12:31

Re: Hilfe bei Algorithmus
 
Wieso noch swap? Little Endian ist doch völlig in Ordnung :gruebel:

Newbie44 30. Aug 2007 12:34

Re: Hilfe bei Algorithmus
 
Zitat:

Zitat von negaH
Das ist simples Festkomma Format im 2'er Komplementär, 16:16.

Delphi-Quellcode:
function ToDouble(Value: Integer): Double;
 
  function Swap(Value: Integer): Integer; // swap Endianess
  asm
    BSWAP EAX
  end;

begin
  Result := Swap(Value) / $10000; // Fixpoint 16:16
end;
Gruß Hagen

Hallo,

wow danke das geht ja echt, ja es ist ein Komplementär verfahren. Deshalb hat es mich gewundert, warum ich die zahlen dann nicht tauschen muss.

das mit den swap ist klar, sonst sind ja die zahlen ganz anders als die die ich haben möchte.

so jetzt muss ich es noch für c++ umschreiben damit ist der käse gegessen.

vielen dank für deine hilfe

Newbie44 30. Aug 2007 16:36

Re: Hilfe bei Algorithmus
 
Jetzt hab ich doch noch ne frage, wie muss ich dann die Datei einlesen damit ich Sie in double convertieren kann, das was in der datei steht sind ja nicht von haus aus gleich die ziffern die ich suche.

blockweise einlesen klappt ja schon ganz gut, jedoch ist mit der datentyp nicht ganz sicher. ein String ist es irgendwie nicht auch ein normaler integer nicht (oder doch)

wäre euch für diese kleine hilfe dankbar

sirius 30. Aug 2007 19:43

Re: Hilfe bei Algorithmus
 
Na irgendwie so (anhand deiner obigen Beschreibung):
Delphi-Quellcode:
var Datei:Tfilestream;
    anzahl,wert:integer;
    i,j:integer;
    koord:array of array[1..3] of double;
begin
  Datei:=TFileStream.create('xyz.dat',fmopenread);
  try
    Datei.read(anzahl,4);
    setlength(koord,anzahl);
    for i:=0 to anzahl-1 do for j:=1 to 3 do
    begin
      Datei.read(wert,4);
      koord[i,j]:=toDouble(wert);
    end
  finally
    Datei.free;
  end;  
end;
oder ist der Text da direkt so drin enthalten :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:38 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