"Unsigned Large Long" als String

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

"Unsigned Large Long" als String

Beitrag 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)
Benutzeravatar
Eric
Beiträge: 303
Registriert: 05.09.2004 09:50
Wohnort: Göttingen

Re: "Unsigned Large Long" als String

Beitrag 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.
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
Bild
Benutzeravatar
PureFan
Beiträge: 19
Registriert: 10.09.2004 14:40
Kontaktdaten:

Beitrag 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
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
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag 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
Benutzeravatar
PureFan
Beiträge: 19
Registriert: 10.09.2004 14:40
Kontaktdaten:

Beitrag 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
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
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Danke, funzt jetzt astrein, PureFan! :D
Antworten