Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Umwandlung Big Endian nach Little Endian (https://www.delphipraxis.net/12629-umwandlung-big-endian-nach-little-endian.html)

jryan 1. Dez 2003 14:02


Umwandlung Big Endian nach Little Endian
 
Hallo alle zusammen!

Ich stehe vor dem Problem, das ich eine Datei habe, in der Zahlenwerte binär im Big Endian Format abgelegt sind. Beim Einlesen dieser Daten per TFileStream.ReadBuffer erhalte ich in meiner Buffervariable natürlich eine falsche Zahl.
Gibt es eine schnelle Variante (evtl. neue TStream-Komponente) die die Konvertierung für mich erledigt? (so das ich in meiner Buffervariable den richtigen Wert habe)

MfG
-jryan

himitsu 1. Dez 2003 14:32

Re: Umwandlung Big Endian nach Little Endian
 
Ein Hallöle von http://www.FrankNStein.de/Smiley-Wolke.gif und ein herzliches Willkommen in unsserer Gemeinde.

Schau mal in der OH nach:

LoadFromStream (Methode von IXMLDocument)
TXMLEncodingType (Typ)

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

jryan 2. Dez 2003 06:09

Re: Umwandlung Big Endian nach Little Endian
 
Hallo himitsu!

Danke für den Hilfeversuch, aber leider hat dieses Problem nichts mit XML zu tun sondern ist eine völlig andere Baustelle.
Es geht mir dabei wirklich darum eine reine Binärdatei in Delphi einzulesen und zu bearbeiten. Diese Binärdatei ist, dabei aber wie gesagt BigEndian codiert.

-jryan

Rainer_Unger 2. Dez 2003 06:41

Re: Umwandlung Big Endian nach Little Endian
 
Hallo,

rechne die Dinger doch um. Hab das Ganze mit little Endian gemacht. Überhaupt kein Problem. Nur High und low Byte vertauschen.

Rainer

himitsu 2. Dez 2003 07:12

Re: Umwandlung Big Endian nach Little Endian
 
Ich hatte mir nur gedacht, dass du dir dieses XML-Zeug für deine Zwecke mißbrauchen könntest.

Wenn nicht, bleibt dir nichts anderes als es selber umzuwandeln, wie Rainer schon sagte.

Den Aufbau kannst du in etwa aus den Typennamen in "TXMLEncodingType (Typ)" entnehmen.

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

jryan 2. Dez 2003 08:43

Re: Umwandlung Big Endian nach Little Endian
 
Tja dann muss ich mir wohl doch selber was ausdenken! Ich hatte bloss gedacht, das es evtl. schon irgendwas vordefiniertes gibt und warum sollte man das Rad jedesmal neu erfinden!

-jryan

choose 2. Dez 2003 08:49

Re: Umwandlung Big Endian nach Little Endian
 
Hallo jryan,

mit einer "schnelle Variante" meinst Du sicher eine, die wenig Änderungen an Deinem Programm erforderlich macht, oder?
Du könntest einen "Dekorierer" (Hier im Forum suchendecorator pattern) entwickeln, der von TStream erbt, die Methoden ReadBuffer, WriteBuffer, Seek, etc. überschreibt und an einen aggregiertes Exemplar von TStream (in Deinem Fall ein TFileStream) delegiert.
Mit dieser Lösung kannst Du einfach ein Exemplar dieser Klasse überall dort verwenden, wo Du bisher mit mit Stream gearbeitet hast, ohne Dein Programm weiter anpassen zu müssen (ggf musst Du Dir Gedanken über die Freigabe des aggregierten Objekts Gedanken machen. Vielleicht hilft ein Blick auf TObjectList in der OH).

Luckie 2. Dez 2003 08:53

Re: Umwandlung Big Endian nach Little Endian
 
Wie wäre es einfach mit einer Funktion die das High- und Low-Word vertauscht? :roll: Gibt es ad nicht sogar einen ASM Befehl?

sakura 2. Dez 2003 09:01

Re: Umwandlung Big Endian nach Little Endian
 
Hi, falls Du eine Delphi3000 Mitgliedschaft hast, dann findest Du hier Deine Lösung: http://www.delphi3000.com/articles/article_1325.asp

...:cat:...

Rainer_Unger 2. Dez 2003 11:26

Re: Umwandlung Big Endian nach Little Endian
 
Hallo,

das ist so einfach, darüber lohnt es sich doch noch nicht einmal Ansatzweise Gedanken zu machen.
Mit 2 Zeilen Code ist das erledigt. Wieviel Zeit brauchst du für das neue Konstrukt?
Wie oft brauchtst du Big Endian?

Rainer

Chewie 2. Dez 2003 12:42

Re: Umwandlung Big Endian nach Little Endian
 
Oder benutz die WinSock-Funktionen
ntohs bzw. htons und
ntohl bzw. htonl.

jryan 3. Dez 2003 06:23

Re: Umwandlung Big Endian nach Little Endian
 
@all:
Danke für die Auskünfte!

@choose:
Das mit dem Decorator werde ich mir mal anschauen. Ich muss ehrlich sagen, das ich den Begriff 'Decorator' eigentlich noch nie gehört habe, aber nach dem ersten überfliegen deines Post in einem anderen Thread hört sich das ganze sehr verlockend an. (Vielleicht nicht unbedingt für diesesn Problem aber auf jeden Fall für einig ander die zur Zeit in mache sind)!

@sakura:
Leider habe ich bisher keine Delphi3000-Account! Nach dem ersten (schnellen) Ansicht der Website stellt sich natürlich für mich die Frage, ist der Account bei denen kostenlos?

@Rainer_Unger:
Für Word-Zahlen hast du natürlich recht. Allerdings habe ich das ganze in eine Zeile unterbekommen :wink: :
Delphi-Quellcode:
function Big2LittleEndian(Wert: Word):Word;
begin
  Result := Lo(Wert) * 256 + Hi(Wert);
end;
Für Longword-Zahlen ist das ganze aus meiner Sicht nicht ganz so simple, Mein Lösungsansatz, den ich gestern gefunden habe ist folgender:
Delphi-Quellcode:
function Big2LittleEndian(Wert: LongWord):LongWord;
var
  i : Integer;
begin
  Result := 0;

  for i:= 0 to 3 do
    Result := (Result SHL 8) + Byte(Wert SHR (8*i));

end;
@Chewie:
:wiejetzt: Da ich eigentlich nicht mit dem Netzwerk arbeiten wollte (und muss, eigentlich soll das Programm auch auf einen Standalone-rechner ohne Netzwerk[auch ohne Modem, ja sowas gibst auch noch] laufen) weis ich auf den ersten Blick nicht, was mir diese Funktionen bringen. Vielleicht könntest du mir das noch mal ganz kurz erklären.

Luckie 3. Dez 2003 06:40

Re: Umwandlung Big Endian nach Little Endian
 
Wie wäre es mit:
Zitat:

The MAKEWORD macro creates a WORD value by concatenating the specified values.

Syntax
Code:
WORD MAKEWORD(
    BYTE bLow,
    BYTE bHigh
);

Entsprechend gibt es auch noch:
Zitat:

The MAKELONG macro creates a LONG value by concatenating the specified values.

Syntax
Code:
DWORD MAKELONG(
    WORD wLow,
    WORD wHigh
);

Zum Zerlegen gibt es wiederum: HiByte und LoByte bzw. HiWord und LoWord.

So würde ich es zu mindest machen. :wink:

Chewie 3. Dez 2003 13:15

Re: Umwandlung Big Endian nach Little Endian
 
Die Funktionen htons etc. greifen nicht auf Netzwerkresourcen zu, sondern stellen nur eine Byte-Reihenfolge-Umkehr da.
htons steht für Host to [/b]N[/b]etwork Short, ntohs macht es umgekehrt. Diese Funktionen arbeiten aber natürlich gleich, sie werden nur wegen der besseren Lesbarkeit unterschieden. Der tiefere Sinn ist der, dass zur Netzübertragung Byte-Reohenfolgen festgelegt sind, nämlich die Host Order und die Network Order. Diese Funktionen sollte es auf jedem Betriebssystem mit Socket-Schnittstelle geben.
htonl und ntohl unterscheiden sich übrigens dadurch, dass sie für 4 Byte-Integer ausgelegt sind und nicht für 2 Byte wie Short.


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