![]() |
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:
Negative Koordinaten:
0,631988525390625
+ 0 —————————————————— 0,631988525390625 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:
Das erste DWORD sagt mir, wie viele Koordinaten drinnen stehen (Multiplizieren mal 3, da es 3 koordinaten für einen Punkt gibt)
3A000000C22E68023711570255384602298A3502965624021B7D0F024C66FA01C6AFE801AEFFD80129A3CA0149D6B901601CA8011DDB99011D9B8C0115FF7E018CD67601C8E76D01039F6501D53F5B017C5D530161814A
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 |
Re: Hilfe bei Algorithmus
Und es ist nicht einfach nur Single?
Ich meine: Wer kocht denn schon mit einem eigenen Format? |
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
|
Re: Hilfe bei Algorithmus
Aha,
du musst einfach nur die 4 Bytes nehmen und das ganze durch 2^16 = 65536 teilen, fertig. |
Re: Hilfe bei Algorithmus
aha danke, kommt dann als datentyp wohl ein single raus?
|
Re: Hilfe bei Algorithmus
Das ist simples Festkomma Format im 2'er Komplementär, 16:16.
Delphi-Quellcode:
Gruß Hagen
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; |
Re: Hilfe bei Algorithmus
Wieso noch swap? Little Endian ist doch völlig in Ordnung :gruebel:
|
Re: Hilfe bei Algorithmus
Zitat:
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 |
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 |
Re: Hilfe bei Algorithmus
Na irgendwie so (anhand deiner obigen Beschreibung):
Delphi-Quellcode:
oder ist der Text da direkt so drin enthalten :gruebel:
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz