AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

NToBE ?

Ein Thema von Bjoerk · begonnen am 2. Mär 2014 · letzter Beitrag vom 8. Mär 2014
Antwort Antwort
Seite 1 von 3  1 23      
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

NToBE ?

  Alt 2. Mär 2014, 10:29
Ich hab folgenden (wohl FreePascal) Code. Da gibst eine (vermutlich) function NToBE.
Kennt die jemand?

Delphi-Quellcode:
procedure DecodeASCII85(ASource: string; var ADest: TFPVUByteArray);
var
  CurSrcPos, CurDestPos: Integer;
  lDataDWordPtr: PCardinal;
  lDataCurChar: Char;
begin
  SetLength(ADest, 0);
  CurDestPos := 0;

  CurSrcPos := 1;
  while CurSrcPos <= Length(ASource) do
  begin
    lDataCurChar := ASource[CurSrcPos];

    // Compressed block of zeroes
    if lDataCurChar = 'zthen
    begin
      SetLength(ADest, Length(ADest)+4);
      ADest[CurDestPos] := 0;
      ADest[CurDestPos+1] := 0;
      ADest[CurDestPos+2] := 0;
      ADest[CurDestPos+3] := 0;
      Inc(CurDestPos, 4);
      Inc(CurSrcPos, 1);
      Continue;
    end;

    // Common block of data: 5 input bytes generate 4 output bytes
    SetLength(ADest, Length(ADest)+4);
    lDataDWordPtr := @(ADest[CurDestPos]);
    if CurSrcPos+4 <= Length(ASource) then
    begin
      lDataDWordPtr^ := (Byte(ASource[CurSrcPos])-33)*85*85*85*85
       + (Byte(ASource[CurSrcPos+1])-33)*85*85*85 + (Byte(ASource[CurSrcPos+2])-33)*85*85
       + (Byte(ASource[CurSrcPos+3])-33)*85 + (Byte(ASource[CurSrcPos+4])-33);
      lDataDWordPtr^ := NToBE(lDataDWordPtr^);
    end
    else if CurSrcPos+3 <= Length(ASource) then
    begin
      lDataDWordPtr^ := (Byte(ASource[CurSrcPos])-33)*85*85*85*85
       + (Byte(ASource[CurSrcPos+1])-33)*85*85*85 + (Byte(ASource[CurSrcPos+2])-33)*85*85
       + (Byte(ASource[CurSrcPos+3])-33)*85 + (Byte('u')-33);
      lDataDWordPtr^ := NToBE(lDataDWordPtr^);
      SetLength(ADest, Length(ADest)-1);
    end
    else if CurSrcPos+2 <= Length(ASource) then
    begin
      lDataDWordPtr^ := (Byte(ASource[CurSrcPos])-33)*85*85*85*85
       + (Byte(ASource[CurSrcPos+1])-33)*85*85*85 + (Byte(ASource[CurSrcPos+2])-33)*85*85
       + (Byte('u')-33)*85 + (Byte('u')-33);
      lDataDWordPtr^ := NToBE(lDataDWordPtr^);
      SetLength(ADest, Length(ADest)-2);
    end
    else if CurSrcPos+1 <= Length(ASource) then
    begin
      lDataDWordPtr^ := (Byte(ASource[CurSrcPos])-33)*85*85*85*85
       + (Byte(ASource[CurSrcPos+1])-33)*85*85*85 + (Byte('u')-33)*85*85
       + (Byte('u')-33)*85 + (Byte('u')-33);
      lDataDWordPtr^ := NToBE(lDataDWordPtr^);
      SetLength(ADest, Length(ADest)-3);
    end
    else
    begin
      raise Exception.Create('[DecodeASCII85] Too few bytes remaining to decode!');
    end;

    Inc(CurDestPos, 4);
    Inc(CurSrcPos, 5);
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.079 Beiträge
 
Delphi 12 Athens
 
#2

AW: NToBE ?

  Alt 2. Mär 2014, 10:45
Wenn du denkst zu wissen wo es her ist, dann schau da doch mal nach?

http://www.freepascal.org/docs-html/...tem/ntobe.html


PS: Man hätte natürlich auch da nachfragen können, wo man den Code her hat und ansonsten kann es nie schaden uns zu verraten von wo das kommt.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: NToBE ?

  Alt 2. Mär 2014, 11:17
Klar, hätte ich machen können, aber schließlich seid doch ihr hier meine Liebsten (Delphianer).

Ist von dort.

Falls jemand Zeit und Lust hat mitzumachen, ich schreibe gerade den dxfreader nach Delphi um (Ist mit Abstand der Beste was ich der Richtung bisher in Delphi gesehen habe?).

Man braucht dazu die fpvutils, fpvectorial und dxfvectorialreader von dort.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#4

AW: NToBE ?

  Alt 2. Mär 2014, 15:28
Habe mir das DXF-Ding gerade mal angeguckt.
Brauchst Du dies "DecodeASCII85" für die DXF überhaupt?
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: NToBE ?

  Alt 2. Mär 2014, 19:26
Hi Bud. Nee, brauch ich nich, war mir aber heute morgen noch nicht bewußt. Das Ding ist übrigens vom dxf-fachlichen her echt gut aber die ganzen Results der functions als Klassen machen einem echt fertig.

Mach ich Records draus /wenn's geht oder ich schmeiß sie ganz raus weil ich ja nicht rendern muß sondern die Daten nur in meine Objecte einlesen muß. Ansonsten hat mir mein C++ Kumpel aus Freiburg auch versprochen, ggf. einen aktuellen Parser von C/ C++ (gibt’s anscheinend mehre Open Source Projekte) nach Delphi zu übersetzen.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#6

AW: NToBE ?

  Alt 2. Mär 2014, 20:03
Also die Qualität kann ich so gerade nicht beurteilen, aber es muß wohl etwas umgeschrieben werden. Und irgendeine Art "Schnittstelle" mußte ja haben.

Hast Du Dich über diese LGPL-Lizenz informiert? Kann man die kommerziell einsetzen?
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: NToBE ?

  Alt 2. Mär 2014, 21:29
Jo. Das kann man so nicht verwenden. Ich habs mal laufen lassen. Wahnsinn (Siehe Anlage). Ich werd die units fpvutils und fpvectorial ganz rauschmeißen und nur die 3 Klassen TDXFToken, TDXFTokenizer und die TvDXFVectorialReader aus der dxfreader verwenden. Die ReadENTITIES bekommen das entsprechende Objekt meiner Software und ein Event um das einer Liste hinzuzufügen.
Wegen der Lizenz. Ich verwende grundsätzlich nichts was nicht abgeklärt ist. Normalerweise mache ich’s so, daß ich dem Autor eine Mail mit der überabeiteten unit schicke und frage an ob ich die so (auch ggf. kommerziell) verwenden kann. Dann kommt in aller Regel ein no poblem und es freut mich, daß sich überhaut mal jemand dafür interessiert.
Angehängte Dateien
Dateityp: pdf Memory Leaks dxfreader freepascal.pdf (233,2 KB, 21x aufgerufen)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#8

AW: NToBE ?

  Alt 2. Mär 2014, 23:30
Zitat:
Die ReadENTITIES bekommen das entsprechende Objekt meiner Software und ein Event um das einer Liste hinzuzufügen.
Man könnte auch jedem ReadENTITY ein spezielles Event zuordnen, wo gleichzeitig die Parameter übergeben werden. Dann ist das noch etwas mehr gekapselt. -Hab sowas mal mit einem experimentellen Parser gemacht-

Edit:
Hab gerade gesehen, dass da hierarchische Strukturen enthalten sind, so dass mein Ansatz nicht so richtig geht und Deiner etwas komplizierter wird. Glaube ich jetzt mal so...
Edit: Geht doch..
Achtung: Bin kein Informatiker sondern komme vom Bau.

Geändert von Jens01 ( 3. Mär 2014 um 00:38 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: NToBE ?

  Alt 3. Mär 2014, 15:01
Wenn man die Insert rausschmeißt geht's, ansonsten braucht man eine Liste innerhalb des Parsers.

BTW: Hast du die Einleseroutine verstanden? Wenn ja wie kommen FloatValue und
IntValue in die DxfItems, da wird später nämlich munter drauf zugegriffen, ich sehe aber kein Einlesen?

Delphi-Quellcode:
  TDxfToken = class
  public
    GroupCode: integer;
    StrValue: string;
    FloatValue: double;
    IntValue: integer;
    Childs: TList;
    procedure Clear;
    constructor Create;
    destructor Destroy; override;
  end;

  TDxfTokenizer = class
  public
    Tokens: TList;
    function TablesSubsection(const Value: string): boolean;
    function BlocksSubsection(const Value: string): boolean;
    function EntitiesSubsection(const Value: string): boolean;
    procedure LoadFromFile(const FileName: string);
    procedure Clear;
    constructor Create;
    destructor Destroy; override;
  end;


procedure TDxfTokenizer.LoadFromFile(const FileName: string);
var
  I: integer;
  StrSectionGroupCode, StrSectionName: string;
  IntSectionGroupCode: integer;
  CurTokenBase, NextTokenBase, SectionTokenBase, LastBlockToken: TList;
  NewToken: TDxfToken;
  ParserState: integer;
  SL: TStringList;
begin
  if FileExists(FileName) then
  begin
    SL := TStringList.Create;
    try
      Tokens.Clear;
      SL.LoadFromFile(FileName);

      CurTokenBase := Tokens;
      NextTokenBase := Tokens;
      I := 0;
      ParserState := 0;

      while I < SL.Count - 1 do
      begin
        CurTokenBase := NextTokenBase;

        // Now read and process the section name
        StrSectionGroupCode := SL.Strings[I];
        IntSectionGroupCode := StrToInt(Trim(StrSectionGroupCode));
        StrSectionName := SL.Strings[I + 1];

        NewToken := TDxfToken.Create;
        NewToken.GroupCode := IntSectionGroupCode;
        NewToken.StrValue := StrSectionName;

        // Waiting for a section
        if ParserState = 0 then
        begin
          if (StrSectionName = 'SECTION') then
          begin
            ParserState := 1;
            NextTokenBase := NewToken.Childs;
          end
          else
            if (StrSectionName = 'EOF') then
            begin
              Exit;
            end
            // Comments can be in the beginning of the file and start with 999
            else
              if (IntSectionGroupCode = 999) then
              begin
                // nothing to be done, let it add the token
              end
              else
              begin
                raise Exception.Create(Format(
                  'TDxfTokenizer.ReadFromStrings: Expected SECTION, but got: %s', [StrSectionname]));
              end;
        end
        // Processing the section name
        else
          if ParserState = 1 then
          begin
            if (StrSectionName = 'HEADER') or
              (StrSectionName = 'CLASSES') or
              (StrSectionName = 'OBJECTS') or
              (StrSectionName = 'THUMBNAILIMAGE') then
            begin
              ParserState := 2;
              SectionTokenBase := CurTokenBase;
            end
            else
              if (StrSectionName = 'BLOCKS') or (StrSectionName = 'TABLES') then
              begin
                ParserState := 4;
                SectionTokenBase := CurTokenBase;
              end
              else
                if (StrSectionName = 'ENTITIES') then
                begin
                  ParserState := 3;
                  SectionTokenBase := CurTokenBase;
                end
                else
                begin
                  raise Exception.Create(Format(
                    'TDxfTokenizer.ReadFromStrings: Invalid section name: %s', [StrSectionname]));
                end;
          end
          // Reading a generic section
          else
            if ParserState = 2 then
            begin
              if StrSectionName = 'ENDSECthen
              begin
                ParserState := 0;
                CurTokenBase := SectionTokenBase;
                NextTokenBase := Tokens;
              end;
            end
            // Reading the ENTITIES section
            else
              if ParserState = 3 then
              begin
                if EntitiesSubsection(StrSectionName) then
                begin
                  CurTokenBase := SectionTokenBase;
                  NextTokenBase := NewToken.Childs;
                end
                else
                  if StrSectionName = 'ENDSECthen
                  begin
                    ParserState := 0;
                    CurTokenBase := SectionTokenBase;
                    NextTokenBase := Tokens;
                  end;
              end
              // Reading the TABLES or BLOCKS sections
              else
                if ParserState = 4 then
                begin
                  // This orders the blocks themselves
                  if TablesSubsection(StrSectionName) or BlocksSubsection(StrSectionName) then
                  begin
                    CurTokenBase := SectionTokenBase;
                    NextTokenBase := NewToken.Childs;
                    LastBlockToken := NewToken.Childs;
                  end
                  // This orders the entities inside blocks
                  else
                    if EntitiesSubsection(StrSectionName) and (LastBlockToken <> nil) then
                    begin
                      CurTokenBase := LastBlockToken;
                      NextTokenBase := NewToken.Childs;
                    end
                    else
                      if StrSectionName = 'ENDSECthen
                      begin
                        ParserState := 0;
                        CurTokenBase := SectionTokenBase;
                        NextTokenBase := Tokens;
                      end;
                end;
        CurTokenBase.Add(NewToken);
        Inc(I, 2);
      end;
    finally
      SL.Free;
    end;
  end;
end;
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#10

AW: NToBE ?

  Alt 3. Mär 2014, 15:14
über dies StrValue in ReadFromStrings?
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 19:57 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