Heute habe ich eine 256,51 KB große Textdatei, CmdControlOrg.txt, (Codepage = UCS-2 LE BOM) mit dem "File to Base64 String Code Generator" gepackt und das Ergebnis in mein Script eingebaut.
Um die Daten zu entpacken, rufe ich nun einfach mal die dafür nötige Funktion auf:
Global $g_bCmdControlOrgTxt = _cmdControl_txt()
Ops, dann habe ich die Daten ja als Binary in der Variable $g_bCmdControlOrgTxt... ich brauche sie aber als String, der in ein Array konvertieren werden soll.
Dann habe ich mir gedacht, machst du das jetzt einfach so:
Global $g_aCmdControlOrgTxt = StringRegExp(BinaryToString(_cmdControl_txt()), '(.+)\R', $STR_REGEXPARRAYGLOBALMATCH)
...und fertig ist das Kind.
Doch... hehe... ne, so einfach sollte es dann doch nicht werden!
Denn heraus kam dabei folgendes:
Ok, was stimmt da nicht?
Ja klar, ich muss die Codepage bei BinaryToString() angeben... in meinem Fall also eine 2. ==> $SB_UTF16LE (2) = binary data is UTF16 Little Endian
Global $g_aCmdControlOrgTxt = StringRegExp(BinaryToString(_cmdControl_txt(), 2), '(.+)\R', $STR_REGEXPARRAYGLOBALMATCH)
Jetzt wieder testen, ob alles easy ist:
ConsoleWrite(' erste Zeile: ' & $g_aCmdControlOrgTxt[0] & @CRLF)
ConsoleWrite('letzte Zeile: ' & $g_aCmdControlOrgTxt[UBound($g_aCmdControlOrgTxt) -1] & @CRLF)
_ArrayDisplay($g_aCmdControlOrgTxt, '$g_aCmdControlOrgTxt')
Was _ArrayDisplay() anzeigt, sieht ja schon mal recht gut aus...
...aber halt, das erste ConsoleWrite() ...wieso ist da ein ? vor dem Text?
6 Dosen Bier und 21 Zigaretten waren nötig, um auf die Lösung zu kommen... und nun, da ich sie kenne, überlege ich, ob es nicht doch besser wäre, wenn ich mich einschläfern lasse.
Es war der BOM!!!
Folgende Zeile brachte dann endgültig das gewünschte Ergebnis:
Global $g_aCmdControlOrgTxt = StringRegExp(BinaryToString(BinaryMid(_cmdControl_txt(), 3), 2), '(.+)\R', $STR_REGEXPARRAYGLOBALMATCH)
So kann man sich den Abend auch totschlagen...