Re: Chr(0) in String verketten und in File schreiben
Verfasst: 03.06.2019 11:15
Erst die Daten im Memory zusammenstellen (AllocateMemory)
Dann die Daten komplett schreiben (WriteData)
Dann die Daten komplett schreiben (WriteData)
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
Code: Alles auswählen
OpenConsole()
a$ = "001122AABBCCDDEEFF" ; Teststring
Repeat
a$ + a$ ; Teststring verlängern
Until Len(a$) > 8000000 ; bis über 8 MB
lenght = Len(a$)
t = ElapsedMilliseconds()
For i = 1 To lenght Step 2
;b$ = Mid(a$, i, 2) ; < - Langsam
b$ = PeekS(@a$ + (i - 1) * SizeOf(character), 2) ; < - Schneller
;byte = Val("$" +b$)
; Kontrollausgabe, wie schnell die Schleife läuft
If i % 10000 = 1
PrintN("Fortschritt: " + Str(i))
EndIf
Next i
PrintN("Zeit: " + Str(ElapsedMilliseconds() - t))
Input()
Code: Alles auswählen
Prototype.i hex2bin(input.p-unicode)
Procedure.i __hex2bin(*input)
Protected *i.Character = *input
Protected bufSize.i = 1024
Protected *buf = AllocateMemory(bufSize)
Protected *bufEnd = *buf + bufSize
Protected *bufTmp
Protected *o.Ascii = *buf
Protected state.i = 0
Protected digit.i
While *i\c
If *i\c <= '9'
digit = *i\c - '0'
Else
digit = (*i\c & $1f) + 9
EndIf
If state = 0
*o\a = digit << 4
state = 1
Else
*o\a | digit
state = 0
*o + 1
If *o = *bufEnd
*bufTmp = ReAllocateMemory(*buf, bufSize * 2)
If Not *bufTmp
FreeMemory(*buf)
ProcedureReturn #False
EndIf
*buf = *bufTmp
*o = *buf + bufSize
bufSize * 2
*bufEnd = *buf + bufSize
EndIf
EndIf
*i + SizeOf(Character)
Wend
If *o - *buf = 0
ProcedureReturn #False
EndIf
*bufTmp = ReAllocateMemory(*buf, *o - *buf)
If Not *bufTmp
FreeMemory(*buf)
ProcedureReturn #False
EndIf
ProcedureReturn *bufTmp
EndProcedure
Global hex2bin.hex2bin = @__hex2bin()
s.s = "57696c6c6b6f6d6d656e20696d20507572652d426f61726400"
*a = hex2bin(s)
Debug PeekS(*a, -1, #PB_Ascii)
FreeMemory(*a)
Code: Alles auswählen
EnableExplicit
;Windows x64 Unicode (uppercase) only!
Import "h2b.lib"
h2bConvert.i(*Str)
h2bSize.i(*Buffer)
h2bFree.i(*Buffer)
EndImport
Global teststring.s
Global *buffer
teststring = "FF00FF"
*buffer = h2bConvert(@teststring)
ShowMemoryViewer(*buffer,3)
Debug h2bSize(*buffer)
Debug h2bFree(*buffer)
End
Ginge schon aber umständlicher und mit mehr Code.NicTheQuick hat geschrieben:Wieso eigentlich als Library? Wäre es nicht einfacher das direkt in Inline-ASM zu machen?
Code: Alles auswählen
If DatabaseQuery(0, insql$, #PB_Database_StaticCursor)
NextDatabaseRow(0)
collen = DatabaseColumnSize(0,0)
*MemoryID = AllocateMemory(collen)
GetDatabaseBlob(0,0,*MemoryID,collen)
If *MemoryID
OpenFile(0,dsname$)
WriteData(0,*MemoryID,collen)
CloseFile(0)
FreeMemory(*MemoryID)
EndIf
EndIf