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 8Aich 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 unsignedUnd 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. ]