Announcement

Collapse
No announcement yet.

TFileStream vertauscht Werte???

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TFileStream vertauscht Werte???

    Ich hab mal eine Frage zu TFileStream.<BR><BR>
    Ich lese eine Stream aus einer Datei in ein Record:<BR><BR><BR>
    TID3v2_Header = Packed Record<BR>
    ID : Array[0..2] Of Char;<BR>
    Version : SmallInt;<BR>
    Flags : Byte;<BR>
    Size : LongInt;<BR><BR>
    …<BR><BR>
    SourceStream.ReadBuffer(ID3v2_Header, SizeOf(ID3v2_Header));<BR><BR><BR>
    Im Record sind dann alle Werte die ich nicht als Array Of Byte oder Char eingelesen habe vertauscht.<BR>
    z.B. Size ist in der Datei $00 00 19 01 im Redord ist es dann $01 19 00 00.<BR><BR>
    Gibt es eine Möglichkeit die Werte in der Richtigen Reinfolge einzulesen z.B. durch setzen einer Compiler Direktive. Oder mache ich prinzipiell irgendetwas falsch?<BR><BR>
    Es ist ja unsinnig jeden Integer erst im nachhinein umzudrehen...<BR><BR>
    Thx schon mal im voraus...

  • #2
    Hallo Martian,<br>ich glaube nicht, dass Du einen Fehler machst. Es sieht eher danach aus, als ob Du die Datei mit einem Hex-Editor betrachtest. In der Intel-Welt werden Bytes im "little endian" Format gespeichert. D.h es wird erst das LowByte und dann das HighByte gespeichert. Daher sieht es so aus, als ob es nicht in der richtigen Reihenfolge erscheint.<br>Der Source liefert die gewünschten und erwarteten Werte
    <pre>
    procedure TForm1.btnWriteClick(Sender: TObject);
    var
    ID3v2_Header : TID3v2_Header;
    F : TFileStream;
    begin
    With ID3v2_Header do
    begin
    ID[0]:='A';
    ID[1]:='B';
    ID[2]:='C';
    Version:=42;
    Flags:=1;
    Size:=$00001901;
    end;
    F:=TFileStream.Create(ApplicationPath+'Test.dat',f mCreate);
    Try
    F.WriteBuffer(ID3v2_Header,SizeOf(ID3v2_Header));
    Finally
    F.Free;
    end;
    end;

    procedure TForm1.btnReadClick(Sender: TObject);
    var
    ID3v2_Header : TID3v2_Header;
    F : TFileStream;
    begin
    F:=TFileStream.Create(ApplicationPath+'Test.dat',f mOpenRead);
    Try
    F.ReadBuffer(ID3v2_Header,SizeOf(ID3v2_Header));
    Finally
    F.Free;
    end;
    end;
    </pre&gt

    Comment


    • #3
      Thx Jens,<br>
      ich denke mal das wird es sein.<br>
      Nur leider hilft mir dein Quellcode nicht weiter.<br>
      Denn die Dateien die ich einlesen muss liegen nun mal in diesem Format vor.<br><br>

      Nun noch eine Frage an alle: Gibt es in Delphi eine Möglichkeit von little endian auf big endian umzuschalten???<br><br>

      Bye Marti

      Comment


      • #4
        Hallo Martin,<br>tut mir Leid, habe leider keine Ahnung

        Comment


        • #5
          x86 CPUs sind immer "little endian". Umschalten unmoeglich.<br>
          Wenn die Werte als "big endian" definiert sind, dann musst du sie halt einzeln umdrehen. Nach dem Lesen und vor dem Schreiben.<br&gt

          Comment


          • #6
            <pre>

            function SwapInteger(Value: Integer): Integer;
            asm
            BSWAP EAX
            end;

            </pre&gt

            Comment


            • #7
              Muß ich es halt so machen. Danke noch mal an alle

              Comment

              Working...
              X