Pascal Funktion in C++??



  • Hi,
    Ich versuche mich gerade ein Programm zuschreiben, das das Mix Format von C&C 1 liest und da hab ich ein kleines prob:
    ich habe auf einer www.wotsit.org eine Funktion in Pascal gefunden, die ich in C++ bräuchte, da ich aber nicht so gut in Pascal bin, funktioniert meine C++ Funktion nicht was mach ich falsch?

    Hier die Pascal Funktion:

    function ROL(l:longint):longint;
    begin
      ROL:=(l shl 1) or (l shr 31);
    end;
    
    function CalcID(name:string):longint;
    type PLong = ^longint;
    var l,i:integer;
        Calc:longint;
    begin
    
      l:=length(name);
      if l>12 then l:=12;
      for i:=1 to l do Name[i]:=UpCase(Name[i]);
      for i:=l+1 to 13 do name[l]:=0;
    
      Calc:=0;
      l:=1;
      while name[l]<>#0 do
      begin
        Calc:=ROL(Calc)+PLong(@name[l])^;
        Inc(l,4);
      end;
    
      CalcID:=Calc;
    end;
    

    und hier mein Versuch in C++:

    signed long CFILEINDEX::CalculateID(char* szID)
    {
        int iLength = 0;
        iLength = static_cast<int>(strlen(szID));
        if(iLength > 12)
        {
            iLength = 12;
        }
    
        for(int i = 0; i < iLength; ++i)
        {
            szID[i] = 128 + toupper(szID[i]);
        }
    
        for(int i = iLength; i < 13; ++i)
        {
            szID[iLength] = 0;
        }
    
        int j = 0;
        signed long* pTest;
        signed long lID = 0;
        while(szID[j] != 0)
        {
            pTest = reinterpret_cast<signed long*>(&szID[j]);
    
            lID = ((lID << 1) | (lID >> 31));
            lID += *pTest;
            j += 4;
        }
    
        return lID;
    }
    


  • Wie kommst du in der ersten for-schleife auf "128 +" ?



  • ups, das war nur ein kleiner Test, auhc ohne funzt es nicht, ich dachte das das signd bzw unsinged char ist und wollt das umwandeln, ohne geht es acuh nciht.



  • was genau funktioniert denn nciht bzw was kommt raus und was sollte rauskommen?



  • Ich hab eigentlich auch nicht so wirklich Ahnung von Pascal. Das wäre erstmal meine 1:1-Übersetzung:

    long ROL(long l)
    {
      return (l << 1) | (l >> 31);
    }
    
    long CalcID(std::string name)
    {
      typedef long * PLong;
    
      int l = name.length();
      if (l>12)
        l=12;
      for (int i=1; i<=l; ++i) 
         Name[i]=toupper(Name[i]);
      for (int i=l+1; i<=13; ++i)
         name[l]=0;
    
      long Calc=0;
      l=1;
      while (name[l] != 0)
      {
        Calc=ROL(Calc)+*reinterpret_cast<PLong>(&name[l]);
        l+=4;
      }
    
      return Calc;
    }
    

    eidt: hatt ein or stehen lassen, statt |

    [ Dieser Beitrag wurde am 16.04.2003 um 16:20 Uhr von Helium editiert. ]



  • Hi,
    erstmal danke für die Hilfe, leider geht es damit auch noch nicht 😞 .
    also, ich lese in den String folgende 4 Bytes ein, ich hab die in Hexa geschrieben, da wenn ich den fertigen String posten, der bestimmt falsch angezeigt wird:
    1F ED 17 8A

    ich weiss zwar noch nciht was genau rauskommen soll, aber die Zahl muss unter 114 sein.

    PS: Sind in Pascla char und Longint sigend oder unsigned?

    Danke schon mal im Voraus.

    Mfg
    Viets



  • In Pacal

    LongInt = 32 Bit signed
    LongWord = 32 Bit unsigned

    Und Pacal-Char kann man eig. nicht mit C++/C-Char vergleichen. Wenn man in C++/C char für 8 Bit unsigned verwendet nimmt man in Pascal (zum. ObjectPascal) Byte, und für signed ShortInt

    Dave



  • Hm,

    hier is nochne version, dazu muss noch gesagt werden, dass ich weder in c noch in cpp programmierung sehr fit bin!

    inline signed long ROL(signed long Value)
    {
      return (Value << 1) | (Value >> 31);
    }
    
    signed long CalcID(char* Name)
    {
      int Len = strlen(Name);
    
      for (int i = 0; i < Len; i++)
      {
        Name[i] = toupper(Name[i]);
      }
    
      for (i = Len; i < 13; i++)
      {
        Name[i] = '\0';
      }
    
      signed long*  Ptr = (signed long*) &Name;
      signed long  ID = 0;
    
      while (*(char*) Ptr != 0)
      {
        ID = ROL(ID);
        ID += *Ptr;
        Ptr++;     
      }
    }
    

    Dave



  • hi,
    erstmal danke für eure Hilfe, die Funktion geht nun, nur sie ist leider falsch herum, diese Funktion macht aus Dateinamen eine eindeutige ID, also aus:

    B1.DES = 885CB5C9

    nun wollt ich fragen, gibt es gute Links wo erklärt wird wie man sowas rückwärts machen kann bzw. hat jemand eine Idee.

    Danke schon mal im Voraus.

    Mfg
    Viets



  • Ich würde sagen Stichwort Little und Big Endian
    EDIT: Ohne mir jetzt alles ganz genau angeguckt zu haben. Also wenn ne HEx-Zahl irgendwie verdreht ist liegt es meistens daran das der Code für nen anderen Endian war

    [ Dieser Beitrag wurde am 16.04.2003 um 11:20 Uhr von MaSTaH editiert. ]


Anmelden zum Antworten