AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language [nicht-Profi] Datentyp auf bestimmte Weise darstellen
Thema durchsuchen
Ansicht
Themen-Optionen

[nicht-Profi] Datentyp auf bestimmte Weise darstellen

Offene Frage von "Nelphin"
Ein Thema von Nelphin · begonnen am 4. Okt 2011 · letzter Beitrag vom 6. Okt 2011
Antwort Antwort
Nelphin

Registriert seit: 2. Feb 2009
Ort: Kaiserslautern
71 Beiträge
 
Turbo Delphi für Win32
 
#1

AW: [nicht-Profi] Datentyp auf bestimmte Weise darstellen

  Alt 5. Okt 2011, 14:51
Ich bin durch zufall darauf gekommen das es für diesen Typ eine delphi komponente TGUID zu geben scheint.
Fällt dir was auf?
Code:
deins {3F2504E0-4F89-11D3-9A-0C-03-05-E8-2C-33-01}
GUID  {3F2504E0-4F89-11D3-9A0C-0305E82C3301}
(gut, man könnte jetzt einfach noch die zusätzlichen "-" da reinschieben)
das mit den zusätzlichen "-" hatte ich gehofft, weil ansonsten doch die spezifikationen gleich sind: 1x4byte 2x2byte und 8x1byte.
in der datei ist das zeugs ja als bytes und die string darstellung ist ja nur zum manuellen vergleich? (oder übersehe ich da etwas?)
Ist die Datei groß genug? (mindestens 105 Byte)
ich habe einige test dateien für das format, keine ist kleiner als 3kbyte.
PS: auf BigEndian/LittleEndian müßte man auch mal schauen
in dem format gibt es im header ein byte das 1 oder 0 sein kann, das vorgibt in welcher reihenfolge die bytes gespeichert sind...
ich habe demnach hier eine funktion gefunden und ausprobiert was dann herauskommt... diese macht beispielsweise aus 00000002 dann 02000000
aber auch so habe ich keine ID entdecken können weder an den Stellen, wo sie meiner Meinung nach sein müssten, noch beim byteweisen durchkriechen.
deswegen vermute ich das meine typen falsch sind.

EDIT: Lesefehler ist behoben... es liest das zeugs jetzt ein. aber sie stimmen halt nicht... ich probier mal noch ein wenig herum.

Geändert von Nelphin ( 5. Okt 2011 um 15:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: [nicht-Profi] Datentyp auf bestimmte Weise darstellen

  Alt 5. Okt 2011, 15:23
mit D2006 läuft folgender Code:
Delphi-Quellcode:
var
  MyGUID:TGuid;
  fs: TFilestream;
  MyGuidStr:string;
begin
  fs:=TFilestream.Create('c:\temp\mydate.doc',fmopenread);
  fs.Position:=89;
  fs.Readbuffer(MyGUID,16); //leider bekomme ich jetzt hier einen fehler
  MyGuidStr:=GuidToString(MyGuid);

  label4.Caption:=MyGuidStr;

  fs.free;
end;
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Nelphin

Registriert seit: 2. Feb 2009
Ort: Kaiserslautern
71 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: [nicht-Profi] Datentyp auf bestimmte Weise darstellen

  Alt 5. Okt 2011, 16:41
Ja, leider bringt mich das nicht weiter, offenbar hat himutsu recht und man muß noch auf little und big endian achten und stellenweise muß auch bitweise eingelesen werden.

die gute nachricht ist, ich habe einen source code der genau das alles macht was ich gerne auch machen können will...

die schlechte nachricht ist, er ist in java und ich kann noch weniger java als delphi...

trotzdem wühle ich mich mal durch die vielen proceduren und versuche die entscheidenden herauszusuchen.

Code:
    public GUID readGUID() throws IOException {
        GUID g = new GUID();
        g.w1 = readU32(); // 4
        g.w2 = readU16(); // 2
        g.w3 = readU16(); // 2
        g.w4 = readU8();
        g.w5 = readU8();
        g.w6 = readU8();
        g.w7 = readU8();
        g.w8 = readU8();
        g.w9 = readU8();
        g.w10 = readU8();
        g.w11 = readU8(); // 8
        return g;

    }
also hiermit liest java wohl das GUID ding ein.
welches wohl so definiert wurde:
Code:
public class GUID {

    /**
     * Special GUID indicating the end of elements in a section of the Logical Scene graph
     */
    public static final GUID END_OF_ELEMENTS = fromString("{FFFFFFFF-FFFF-FFFF-FF-FF-FF-FF-FF-FF-FF-FF}");

    public static final int LENGTH = 16;
    public long w1;
    public int w2;
    public int w3;
    public int w4;
    public int w5;
    public int w6;
    public int w7;
    public int w8;
    public int w9;
    public int w10;
    public int w11;
es werden also readU32 readU16 und readU8 methoden verwendet...

ich häng mal noch eine an:

Code:
    // An unsigned 32-bit integer
    public long readU32() throws IOException {
        try {
            int ch1 = get();
            int ch2 = get();
            int ch3 = get();
            int ch4 = get();

            if (getByteOrder() == ByteOrder.LITTLE_ENDIAN)
                return ((ch4 << 24) | (ch3 << 16) | (ch2 << 8) | (ch1 << 0)) & 0xFFFFFFFFL;
            else
                return ((ch1 << 24) | (ch2 << 16) | (ch3 << 8) | (ch4 << 0)) & 0xFFFFFFFFL;
        } catch (BufferOverflowException e) {
            throw new IOException(e);
        }
also ich verstehe die letzte Funktion bisher so, das mit den zeilen int ch1 = get(); usw sowas ähnliches wie
fs.read(puffer,1) gemacht wird, aber ich verstehe nicht was in der if anweisung genau gemacht wird.

Wenn ich nun versuchen würde das in delphianisch zu bekommen, wie würde ich einen datentyp definieren so wie hier das GUID definiert ist?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#4

AW: [nicht-Profi] Datentyp auf bestimmte Weise darstellen

  Alt 5. Okt 2011, 17:13
Du meinst die "<<"? Das ist Bit-Shifting, in Delphi sähe das etwa so aus (Pseudo-Code):
Delphi-Quellcode:
if LITTLE_ENDIAN then
  Result := ((ch4 shl 24) or (ch3 shl 16) or (ch2 shl 8) or ch1) and $FFFFFFFF
else
  Result := ((ch1 shl 24) or (ch2 shl 16) or (ch3 shl 8) or ch4) and $FFFFFFFF;
Wobei ich mir nicht sicher bin, wozu da noch mit MAX_DWORD ver"and"et wird, schaden kann es aber nicht.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: [nicht-Profi] Datentyp auf bestimmte Weise darstellen

  Alt 5. Okt 2011, 17:18
Je nachdem ob LITTLEENDIAN oder BIGENDIAN gespeichert wurde, werden die gelesenen Bytes in einer anderen Reihenfolge ausgegeben.

Du mußt nur wissen wie abgespeichert wurde.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Nelphin

Registriert seit: 2. Feb 2009
Ort: Kaiserslautern
71 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: [nicht-Profi] Datentyp auf bestimmte Weise darstellen

  Alt 5. Okt 2011, 17:58
Je nachdem ob LITTLEENDIAN oder BIGENDIAN gespeichert wurde, werden die gelesenen Bytes in einer anderen Reihenfolge ausgegeben.

Du mußt nur wissen wie abgespeichert wurde.

Gruß
K-H
das weiß ich sogar:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
fs: TFilestream;
ByteOrder:byte;
begin
fs:=TFilestream.Create(edit1.Text,fmopenread);
fs.Position:=80;
fs.ReadBuffer(ByteOrder,1);

case ByteOrder of
  0 : Listbox1.Items.add('BYTE ORDER: LITTLE ENDIAN');
  1 : Listbox1.Items.add('BYTE ORDER: BIG ENDIAN');
  else Listbox1.Items.add('WARNUNG! BYTE ORDER UNKLAR');
end;

fs.free;
end;
In meinen vorliegenden Beispielen ist die ByteOrder 0 also LITTLE ENDIAN.
  Mit Zitat antworten Zitat
Nelphin

Registriert seit: 2. Feb 2009
Ort: Kaiserslautern
71 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: [nicht-Profi] Datentyp auf bestimmte Weise darstellen

  Alt 6. Okt 2011, 19:26
ich habe inzwischen einige funktionen geschrieben um einzelne bereiche der daten auszulesen...

ich bin aber nicht so wirklich geübt im erstellen von Funktionen, klassen und so, deshalb wäre ich für etwas feedback oder Hinweise was ich noch beachten muß dankbar:

so sieht das zum beispiel jetzt aus:

Delphi-Quellcode:
type
  TJupTeReader = class(TObject)
     public

     class function getVersion (fs : Tfilestream) :string;
     class function getByteOrder (fs : Tfilestream) :shortint;
     class function getI32 (fs : TFilestream; pos : integer) :integer;
     class function getU32 (fs : TFilestream; pos : integer) :Longword;
     class function getMyGUID (fs : TFilestream; pos : integer) :TGUID;
  end;
implementation


class function TJupTeReader.getVersion(fs: TFilestream):string;
var i:integer;
var bufferchar:char;
var ResultStr:string;
begin
  for i := 0 to 79 do begin
    fs.Position:=i;
    fs.Readbuffer(bufferchar,1);
    ResultStr:=ResultStr+char(bufferchar);
  end;
  result:=ResultStr;
end;
class function TJupTeReader.getByteOrder(fs: Tfilestream):shortint;
var ByteOrder:byte;
    ResultByteOrder:shortint;
begin
  fs.Position:=80;
  fs.ReadBuffer(ByteOrder,1);
  if (ByteOrder=0) or (ByteOrder=1) then ResultByteOrder:=ByteOrder
  else ResultByteOrder:=-1;
  Result:=ResultByteOrder;
end;
class function TJupTeReader.getI32(fs: TFileStream; pos : integer):integer;
begin
  fs.Position:=pos;
  fs.ReadBuffer(Result,4);
end;
class function TJupTeReader.getU32(fs:TFilestream; pos:integer):Longword;
begin
  fs.Position:=pos;
  fs.ReadBuffer(Result,4);
end;
class function TJupTeReader.getMyGUID (fs : TFilestream; pos : integer) :TGUID;
begin
  fs.Position:=pos;
  fs.read(Result,16);
end;
Konkrete Fragen formuliere ich mal hier:

1.) ist es überhaupt geschickt einen filestream zu übergeben um einzelne bereiche auszulesen?
2.) Mit der Funktion U32 soll ein unsigned 32 bit integer value geladen werden, deshalb habe ich LongWord gewählt, hätte ich auch Cardinal nehmen können oder sogar müssen?
3.) für ein Attribut soll ich an einer bestimmten stelle ein U32 einlesen, jetzt heisst es aber zur Interpretation des Atributes wie folgt:

Zitat:
Attributes is a collection of segment information encoded within a single U32 using the following bit allocation.
Bits 0 - 23
Reserved for future use.
Bits 24 - 31
Segment type. Complete list of Segment types can be found in Table 3: Segment Types.
wenn ich das richtig deute verraten mir also die letzten 8 bits die information? Tabelle 3 zeigt aber nur eine liste von 1-24 verschiedenen attributen. da steht dann nichts mehr von bits.. wie könnte das gemeint sein?
4.) nochmal eine delphi frage: ich rufe die einzelnen funktionen jetzt von ausserhalb etwa so auf: entrycount:=TJupteReader.getI32(testfs,TocOffset). was irgendwie umständlich aussieht.. gibt es dafür etwas besseres?

ich danke schonmal für eure Hilfe und Anregungen. bitte habt Nachsicht mit mir

Geändert von Nelphin ( 6. Okt 2011 um 19:31 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:45 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