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! :D

//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! :D