Seite 1 von 1
"Unsigned Large Long" als String
Verfasst: 31.08.2005 14:16
von hardfalcon
Hallo, ich habe ein Problem: ich habe eine WinAPI-Funktion, die einen "Unsigned Large Long"-Wert in einen speicherbufer schreibt. Dazu 2 Fragen:
1.) Ist dieses "Unsigned Large Long" ein UInt64-Wert?
2.) Wie krieg ich diesen Buffer in ein String verwandelt, der den "Unsigned Large Long"-Wert als lesbare Zahl enthält?
danke schonmal im Vorraus, mit den UInt64-Funktionen von PBOSL bin ich noch nicht weitergekommen...

//EDIT: Hier ist mein Code:
Code: Alles auswählen
DefType.l ticks
ticks = AllocateMemory(8)
QueryPerformanceCounter_(ticks)
Debug PeekS(ticks,8)
FreeMemory(ticks)
Re: "Unsigned Large Long" als String
Verfasst: 31.08.2005 14:58
von Eric
hardfalcon hat geschrieben:Hallo, ich habe ein Problem: ich habe eine WinAPI-Funktion, die einen "Unsigned Large Long"-Wert in einen speicherbufer schreibt.
BOOL QueryPerformanceCounter(
LARGE_INTEGER *lpPerformanceCount
);
Laut msdn ist das Ding mit Vorzeichen und entspricht Int64.
und zu 2. versuch es mal mit wsprintf, das klappt jedenfalls mit normalen ints , aber ob das auch mit Int64 funktioniert, weiß ich nicht.
Mit PeekS wirst du jedenfalls nicht viel erreichen können.
Verfasst: 31.08.2005 15:19
von PureFan
Code: Alles auswählen
Procedure IsNULL(*Memory.BYTE,len.l)
isnull=1
For I=0 to len-1 step 1
if *Memory\b<>0
Isnull=0
endif
*Memory+1
next I
ProcedureReturn isnull
endprocedure
Procedure Div10(*Memory.BYTE,len.l)
*Memory+len
For I=0 to len-1 step 1
*Memory-1
val=*Memory\b&$FF + rest*$100
nval = val/10
Rest=val-nval*10
*Memory\b=nval
next I
ProcedureReturn rest
EndProcedure
;Wandelt jeden belieben Speicherbereich in eine dezimale Zahl um!
Procedure.s Num2Str(*Memory.BYTE,len.l)
*tmp=GlobalALloc_(0,len)
if *tmp
CopyMemory(*Memory,*tmp,len)
while isnull(*tmp,len)=0
char.s= Str(Div10(*tmp,len))+char
wend
GlobalFree_(*tmp)
endif
ProcedureReturn char
EndProcedure
Structure QWORD
low.l
high.l
EndStructure
;- Beispiel 1
a.l=1234567
debug Num2Str(@a,4)
;- Beispiel 2
QueryPerformanceCounter_(ticks.QWORD)
debug Num2Str(@ticks,8)
Die Funktion Num2Str() funktioniert mit jedem Unsigned Zahlenformat in jeder beliebigen Größe und wandelt sie in einen dezimalen String um.
[EDIT] Code oben geupdatet. Es fehlte ein "*Memory+1"
Mfg,
PureFan
Verfasst: 31.08.2005 15:28
von hardfalcon
Vielen Dank für die schnelle Hilfe, Eric und PureFan!
//EDIT: Da scheint noch irgendwo ein Bug drinzustecken... Wenn ich folgenden Code laufen lasse, habe ich immer wieder mal Blöcke von 2-3 Zahlen, die nur 2-4 Stellen habaen... Aber erklären kann ich mir das absolut nicht...
Code: Alles auswählen
Procedure IsNULL(*Memory.BYTE,len.l)
isnull=1
For I=0 To len-1 Step 1
If *Memory\b<>0
Isnull=0
EndIf
Next I
ProcedureReturn isnull
EndProcedure
Procedure Div10(*Memory.BYTE,len.l)
*Memory+len
For I=0 To len-1 Step 1
*Memory-1
val=*Memory\b&$FF + rest*$100
nval = val/10
Rest=val-nval*10
*Memory\b=nval
Next I
ProcedureReturn rest
EndProcedure
;Wandelt jeden belieben Speicherbereich in eine dezimale Zahl um!
Procedure.s Num2Str(*Memory.BYTE,len.l)
*tmp=GlobalAlloc_(0,len)
If *tmp
CopyMemory(*Memory,*tmp,len)
While IsNULL(*tmp,len)=0
char.s= Str(Div10(*tmp,len))+char
Wend
GlobalFree_(*tmp)
EndIf
ProcedureReturn char
EndProcedure
Structure QWORD
low.l
high.l
EndStructure
;- Beispiel 1
a.l=1234567
Debug Num2Str(@a,4)
;- Beispiel 2
For k=1 To 500
QueryPerformanceCounter_(ticks.QWORD)
Debug Num2Str(@ticks,8)
Next k
Verfasst: 31.08.2005 17:34
von PureFan
Fehler behoben, es fehlte ein "*Memory+1" in der Prozedur IsNULL()
Code: Alles auswählen
Procedure IsNULL(*Memory.BYTE,len.l)
isnull=1
For I=0 To len-1 Step 1
If *Memory\b<>0
Isnull=0
EndIf
*Memory+1
Next I
ProcedureReturn isnull
EndProcedure
Mfg,
PureFan
Verfasst: 31.08.2005 20:24
von hardfalcon
Danke, funzt jetzt astrein, PureFan!
