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:
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.
El_Choni_work: cant't you just spit the binary data to sqlite, as you would spit a hamster into a microwave oven?
* Fangles falls off the chair laughing
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
Zuletzt geändert von PureFan am 31.08.2005 17:33, insgesamt 1-mal geändert.
Procedure x(a,b,c):If a:ProcedureReturn b:EndIf:ProcedureReturn c:EndProcedure:For I=0 To 6:T.s+Chr(I&1+x(((I&4)/4+(I&2)/2-I&1+1)&6,1,0)<<1+x(I&1-(I&4)/4,1,0)<<2+x((I+2)&7,0,1)<<3+((4-(I+1)&4)/4)<<4+x(3-(I+3)&3,1,0)<<5+64):Next I:Debug T
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...
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
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
Procedure x(a,b,c):If a:ProcedureReturn b:EndIf:ProcedureReturn c:EndProcedure:For I=0 To 6:T.s+Chr(I&1+x(((I&4)/4+(I&2)/2-I&1+1)&6,1,0)<<1+x(I&1-(I&4)/4,1,0)<<2+x((I+2)&7,0,1)<<3+((4-(I+1)&4)/4)<<4+x(3-(I+3)&3,1,0)<<5+64):Next I:Debug T