Jump to content
Sign in to follow this  
junkew

Stringregexp problem on binary string

Recommended Posts

junkew

Hi

I am trying to split a binary string into an array based on a certain length

Is stringregexp compatible with binary strings?

Below doesn't seem to work (not all code here as I get the bitmap into a (binary) string $BMP2Data)

$splitMeOn = '.{1,' & $BMP2LineWidth - $padBytes2 & '}' also no difference

;Get all of the picturelines of 2nd bitmap in a seperate array
    ReDim $picLines[$BMP2Height]
;~  $picLines=stringregexp($BMP2Data,"(.{" & $BMP2LineWidth - $padBytes2 & "})*",1)
    $splitMeOn = '(.{1,' & $BMP2LineWidth - $padBytes2 & '})*'
    $picLines=stringregexp($BMP2Data, $splitMeOn, 3)
    consolewrite(@error &  $splitMeOn & " array " & ubound($picLines) & ";" & stringlen($bmp2data) &  ";" & $BMP2Height & @crlf)

I rewrote it by calculating myself but thats not very efficient (not fast enough for me)

for $i=0 to $BMP2Height-1
        $picLines[$i]=StringMid($BMP2Data, 1 + ($i * $BMP2LineWidth), ($BMP2LineWidth - $padBytes2))
        next

Base sample thats working to prove the concept

$array = StringRegExp('0123456', '(.{1,2})', 3)
for $i = 0 to UBound($array) - 1
    msgbox(0, "RegExp Test with Option 2 - " & $i, $array[$i])
Next
Edited by junkew

Share this post


Link to post
Share on other sites
Authenticity

The quantifier "*" is called to matches the entire pattern zero or more times.

#include <Array.au3>

Local $sString = "1234#5678"
Local $avMatch = StringRegExp($sString, "(\d)*", 3) ; Can match even nothing to success
If IsArray($avMatch) Then _ArrayDisplay($avMatch, "(\d)*")

$avMatch = StringRegExp($sString, "\d*", 3) ; Can match even nothing to success, alternative, but implicitly anchored
If IsArray($avMatch) Then _ArrayDisplay($avMatch, "\d*")

$avMatch = StringRegExp($sString, "(\d)+", 3) ; Must match at least once to success
If IsArray($avMatch) Then _ArrayDisplay($avMatch, "(\d)+")

$avMatch = StringRegExp($sString, "\d+", 3) ; Must match at least once to success, not anchored
If IsArray($avMatch) Then _ArrayDisplay($avMatch, "\d+")

$avMatch = StringRegExp($sString, "(\d+)", 3) ; The intended way
If IsArray($avMatch) Then _ArrayDisplay($avMatch, "(\d+)")

$avMatch = StringRegExp($sString, "\G(\d+)", 3) ; Don't skip characters, match only at the start of the last match
If IsArray($avMatch) Then _ArrayDisplay($avMatch, "\G(\d+)")

Test a few cases before you try the big toys. :)

Share this post


Link to post
Share on other sites
junkew

As said before its not working when I use

$splitMeOn = '.{1,' & $BMP2LineWidth - $padBytes2 & '}'

$splitmeOn has the value .{1,288} which should describe any character from 1-288 characters

$splitMeOn = '(.{1,' & $BMP2LineWidth - $padBytes2 & '})'

doesn't do the trick either

Edited by junkew

Share this post


Link to post
Share on other sites
Authenticity

And the data is what? Is it a string representation of the image data? Binary representation?

Share this post


Link to post
Share on other sites
junkew

Simplified and made a full example.

Its binary data so I assume stringregexp is not working on binarydata?

#include <IE.au3> 
#include <Array.au3>
#include <string.au3>

local $hexString = "D4E6E9CDDFE3C9DCE1C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC9DBE0C9DBE0C9DBE0C9DCE1CBDDE2CDDFE3D4E6E9CDDFE3D0E1E6A79579835624743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C007D4C159F8766D2E4E8D1E4E7CBDDE2A79579A27D55DDCFC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8DFD5A27D55A8957AD4E6E9CBDDE2835624DCCEBFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFEFEDBCEBF835624D9EAECC9DCE1743C00FCFDFDFCFDFDFCFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFAFBFBF2F4F6743C00DEECEFCBDDE2743C00FAFAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF8FAFAF2F4F5EAEEF0743C00E0EDF00D0A" 
Local $sString = _hextostring($hexString)

consolewrite("Total length <" & stringlen($sString) & ">" &@crlf)

;~ tryit("(.{0,288})*")
;~ tryit(".{0,288}*")
;~ tryit("(.{0,288})+")
tryit(".{0,288}+")
;~ tryit("(.{0,288}+)")
;~ tryit("\G({0,288}+)")
tryit(".{0,20}+")
func tryIt($p)
    Local $avMatch = StringRegExp($sString, $p, 3)  
    If IsArray($avMatch) Then 
        _ArrayDisplay($avMatch, $p)
        for $i=0 to ubound($avMatch)-1
            consolewrite(stringlen($avmatch[$i]) & @crlf)
        next
    else 
        consolewrite($p & " has not returned an array" & @crlf)
    EndIf
    
EndFunc
Exit

Share this post


Link to post
Share on other sites
junkew

most likely it seems stringregexp stops at encountering 00 at position 302 in the string

Is this expected behavior?

288:CD 289:DF 290:E3 291:D0 292:E1 293:E6 294:A7 295:95 296:79 297:83 298:56 299:24 300:74 301:3C 302:00 303:74 304:3C 305:00 306:74 307:3C 308:00 309:74 310:3C 311:00 312:74 313:3C 314:00 315:74 316:3C

tryit(".{0,288}+")
;~ tryit("(.{0,288}+)")
;~ tryit("\G({0,288}+)")
;~ tryit(".{0,20}+")

for $i=288 to (288 * 2 + 38)
    consolewrite( $i & ":" & stringmid($hexString,$i*2+1,2) & " ")
Next

Share this post


Link to post
Share on other sites
Authenticity

Yes, the binary representation of it is the literal string "00" but turning it into a character produces a null terminated string, I guess:

#include <Array.au3>
#include <string.au3>

Local $hexString = "D4E6E9CDDFE3C9DCE1C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC9DBE0C9DBE0C9DBE0C9DCE1CBDDE2CDDFE3D4E6E9CDDFE3D0E1E6A79579835624743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C007D4C159F8766D2E4E8D1E4E7CBDDE2A79579A27D55DDCFC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8DFD5A27D55A8957AD4E6E9CBDDE2835624DCCEBFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFEFEDBCEBF835624D9EAECC9DCE1743C00FCFDFDFCFDFDFCFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFAFBFBF2F4F6743C00DEECEFCBDDE2743C00FAFAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF8FAFAF2F4F5EAEEF0743C00E0EDF00D0A"
Local $sString = _HexToString($hexString)

ConsoleWrite("Total length <" & StringLen($sString) & ">" & @CRLF)

;~ tryit("(.{0,288})*")
;~ tryit(".{0,288}*")
;~ tryit("(.{0,288})+")
tryit(".{0,288}+", $hexString)
;~ tryit("(.{0,288}+)")
;~ tryit("\G({0,288}+)")
tryit(".{0,20}+", $sString)

Func tryIt($p, $sStr)
    Local $avMatch = StringRegExp($sStr, $p, 3)
    If IsArray($avMatch) Then
        _ArrayDisplay($avMatch, $p)
        For $i = 0 To UBound($avMatch) - 1
            ConsoleWrite(StringLen($avMatch[$i]) & @CRLF)
        Next
    Else
        ConsoleWrite($p & " has not returned an array" & @CRLF)
    EndIf

EndFunc   ;==>tryIt
Exit

Share this post


Link to post
Share on other sites
AndyG

from Authenticity in an other thread in this forum...(i was able to use it very well, thx)

$sData = StringTrimRight(StringRegExpReplace(StringTrimLeft($xBytes, 2), "(.{" & $iStride & "})", "\1@"), 1)
    $avData = StringSplit($sData, "@")

Example:

#include <Array.au3>
#include <GDIPlusConstants.au3>
#include <WinAPI.au3>
#include <GDIPlus.au3>
;"\pic2.jpg"
;"\testfullscreen.bmp"
$t = TimerInit()
$array=_GetPixelRowsFromBMP(@ScriptDir & "\pic2.jpg", @ScriptDir & "\Test.txt");writes the rows into a textfile
$m = TimerDiff($t)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : time = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

Func _GetPixelRowsFromBMP($sImage, $sOutputFile)  ;thx to
    Local $hImage, $hBmp, $iW, $iH
    Local $tBD, $iWidth, $iHeight, $iStride, $iFmt
    Local $pData, $tPixels, $xBytes
    Local $avPixels, $hFile

    $hFile = FileOpen($sOutputFile, 2)
    If @error Then Return SetError(1, 1, 0)

    _GDIPlus_Startup()

    $hImage = _GDIPlus_ImageLoadFromFile($sImage)
    If @error Then Return SetError(1, 2, 0)

    $iW = _GDIPlus_ImageGetWidth($hImage)
    $iH = _GDIPlus_ImageGetHeight($hImage)
    $hBmp = _GDIPlus_BitmapCloneArea($hImage, 0, 0, $iW, $iH, $GDIP_PXF32ARGB)
    $tBD = _GDIPlus_BitmapLockBits($hBmp, 0, 0, $iW, $iH, BitOR($GDIP_ILMREAD, $GDIP_ILMWRITE), $GDIP_PXF32ARGB)

    $iWidth = DllStructGetData($tBD, 1)
    $iHeight = DllStructGetData($tBD, 2)
    $iStride = DllStructGetData($tBD, 3)
    $iFmt = DllStructGetData($tBD, 4)
    $pData = DllStructGetData($tBD, 5)

    $tPixels = DllStructCreate("byte[" & $iW * $iH * 4 & "]", $pData)
    $xBytes = DllStructGetData($tPixels, 1)

    $sData = StringTrimRight(StringRegExpReplace(StringTrimLeft($xBytes, 2), "(.{" & $iStride & "})", "\1@"), 1)
    $avData = StringSplit($sData, "@")

    For $i = 1 To $avData[0]
        FileWrite($hFile, $avData[$i] & @CRLF)
    Next
    FileClose($hFile)

    _GDIPlus_BitmapUnlockBits($hBmp, $tBD)
    _WinAPI_DeleteObject($hBmp)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    return $avData
EndFunc   ;==>_GetImagePixels

Share this post


Link to post
Share on other sites
junkew

That example is exactly breaking around 00 character at position 302. So that link will not solve the problem I have

What i am trying to do is indeed to break up a picture into several lines (which works when I do put it in an array myself).

It just doesn't work with the stringregexp

local $hexString = "D4E6E9CDDFE3C9DCE1C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC9DBE0C9DBE0C9DBE0C9DCE1CBDDE2CDDFE3D4E6E9CDDFE3D0E1E6A79579835624743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C007D4C159F8766D2E4E8D1E4E7CBDDE2A79579A27D55DDCFC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8DFD5A27D55A8957AD4E6E9CBDDE2835624DCCEBFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFEFEDBCEBF835624D9EAECC9DCE1743C00FCFDFDFCFDFDFCFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFAFBFBF2F4F6743C00DEECEFCBDDE2743C00FAFAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF8FAFAF2F4F5EAEEF0743C00E0EDF00D0A" 
Local $sString = _hextostring($hexString)

consolewrite("Total length <" & stringlen($sString) & ">" &@crlf)

$sString=StringTrimRight(StringRegExpReplace(StringTrimLeft($sString, 2), "(.{" & 288 & "})", "\1@"), 1)

consolewrite("Total length <" & stringlen($sString) & ">" &@crlf)

Share this post


Link to post
Share on other sites
Authenticity

Is there any reason the data needs be a character string of the hex values? You can't match a string that contain a null character because it's denoting the end of the string, unless you walk the string using a byte buffer or something similar. From the example above, you already got the data in binary minus the "0x" at the start of the string, capture the binary string using a multiply of 2 characters, representing one byte.

Share this post


Link to post
Share on other sites
AndyG

 

That example is exactly breaking around 00 character at position 302

Sry, you did a mistake in your script...

If you split the $hexstring first and after that convert every part of the splitted hexstring into a binary, then you have what you are looking for!

#include <Array.au3>
#include <String.au3>

Local $hexString = "D4E6E9CDDFE3C9DCE1C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC9DBE0C9DBE0C9DBE0C9DCE1CBDDE2CDDFE3D4E6E9CDDFE3D0E1E6A79579835624743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C007D4C159F8766D2E4E8D1E4E7CBDDE2A79579A27D55DDCFC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8DFD5A27D55A8957AD4E6E9CBDDE2835624DCCEBFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFEFEDBCEBF835624D9EAECC9DCE1743C00FCFDFDFCFDFDFCFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFAFBFBF2F4F6743C00DEECEFCBDDE2743C00FAFAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF8FAFAF2F4F5EAEEF0743C00E0EDF00D0A"

ConsoleWrite("Total length <" & StringLen($hexString) / 2 & ">" & @CRLF) ;number in bytes....right?

$hexString = StringTrimRight(StringRegExpReplace($hexString, "(.{" & 288 * 2 & "})", "\1@"), 1) ;2 character in a hex is one byte, regex places a @ at every 288. "byte"
$array = StringSplit($hexString, "@") ;splits the hex"string" into an array  , every single "string" has a lenght of 288 bytes (288 * 2 hex-character)
_ArrayDisplay($array) ;you could convert every "row" to a string with _hextostring

$sString = ""
For $i = 1 To UBound($array) - 1 ;now we convert the hex to binary and put all together into a big string
    $sString &= _HexToString($array[$i]) ;make every (288 byte) part of the hexstring to a real string including nullbytes!
    ConsoleWrite(@CRLF & StringLen(_HexToString($array[$i])) & "      " & _HexToString($array[$i]) & @CRLF) ; this function doesn´t SHOW anything after a nullbyte, but the string is not cutted by the function! it really exists with full lenght
Next

ConsoleWrite(@CRLF & "Total length <" & StringLen($sString) & ">" & @CRLF) ;this is the lenght of the whole string
ConsoleWrite(@CRLF & $sString) ;shows you not the 1730 bytes.....because after the first nullbyte ...you know it ;)
ConsoleWrite(@CRLF)


;or so...
Local $hexString = "D4E6E9CDDFE3C9DCE1C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C9DBE0C2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC2D6DBC9DBE0C9DBE0C9DBE0C9DCE1CBDDE2CDDFE3D4E6E9CDDFE3D0E1E6A79579835624743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C00743C007D4C159F8766D2E4E8D1E4E7CBDDE2A79579A27D55DDCFC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8DFD5A27D55A8957AD4E6E9CBDDE2835624DCCEBFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDFEFEDBCEBF835624D9EAECC9DCE1743C00FCFDFDFCFDFDFCFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFBFCFCFAFBFBF2F4F6743C00DEECEFCBDDE2743C00FAFAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF9FAFAF8FAFAF2F4F5EAEEF0743C00E0EDF00D0A"
$string=_hextostring($hexstring)  ;into binary
dim $row[stringlen($string)/288+2]  ;number of rows of the bitmap
$k=0
for $i=1 to stringlen($string) step 288 ;we step through the string....
    $k+=1  ;nice construction, isn´t it?   :o)
    $row[$k]=stringmid($string,$i,288) ;...and write every string with the lenght of 288 byte into an array
next

;ok, lets compare what we have done in the 2 examples
if $row[3]=_HexToString($array[3]) then MsgBox(0, 'Compare', "...match" )
  Edited by AndyG

Share this post


Link to post
Share on other sites
junkew

The hexstring is only there to make the sample reproducible in a short amount of code.

I have a binary string (based on the bitmap bits) where I want to do a split with the stringregexp function.

This function seems to be breaking on 00 bytes (most likely a \0 string terminator)

For me it doesn't make sense to first convert the binary to hex (is slow) and then split and finally convert back to the binaryrepresentation.

Then I will stick to the mid(string,start,end) splitting myself.

Share this post


Link to post
Share on other sites
junkew

Based on the sample a full example that shows that stringregexp is not able to handle the 00 (method 2)

And the one with stringregexprepl combined with a split seems to be a workaround (method 1) although I have some doubt on what happens if I have the binary value of @ in my bitmap

stringregexp and stringregexprepl seems to behave differently on matching

calculator.bmp should be placed in %temp% folder

Tried with many regular expressions but results stay the same

From the demo this line should be correct

$avData=stringregexp($xBytes, ".{1," & $iStride & "}+", 3)

#include <Array.au3>
#include <GDIPlusConstants.au3>
#include <WinAPI.au3>
#include <GDIPlus.au3>

$fileName=@tempdir & "\calculator.bmp"

$t = TimerInit()
$array=_GetPixelRowsFromBMP($filename, @Tempdir & "\Test.txt",1);writes the rows into a textfile
$array=_GetPixelRowsFromBMP($filename, @Tempdir & "\Test2.txt",2);writes the rows into a textfile

$m = TimerDiff($t)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : time = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

Func _GetPixelRowsFromBMP($sImage, $sOutputFile, $method)  ;thx to
    Local $hImage, $hBmp, $iW, $iH
    Local $tBD, $iWidth, $iHeight, $iStride, $iFmt
    Local $pData, $tPixels, $xBytes
    Local $avPixels, $hFile

    _GDIPlus_Startup()

    $hImage = _GDIPlus_ImageLoadFromFile($sImage)
    If @error Then Return SetError(1, 2, 0)

    $iW = _GDIPlus_ImageGetWidth($hImage)
    $iH = _GDIPlus_ImageGetHeight($hImage)
    $hBmp = _GDIPlus_BitmapCloneArea($hImage, 0, 0, $iW, $iH, $GDIP_PXF32ARGB)
    $tBD = _GDIPlus_BitmapLockBits($hBmp, 0, 0, $iW, $iH, BitOR($GDIP_ILMREAD, $GDIP_ILMWRITE), $GDIP_PXF32ARGB)

    $iWidth = DllStructGetData($tBD, 1)
    $iHeight = DllStructGetData($tBD, 2)
    $iStride = DllStructGetData($tBD, 3)
    $iFmt = DllStructGetData($tBD, 4)
    $pData = DllStructGetData($tBD, 5)

    $tPixels = DllStructCreate("byte[" & $iW * $iH * 4 & "]", $pData)
    $xBytes = DllStructGetData($tPixels, 1)

if $method=1 Then
;~ Method 1 by replacing and splitting
    $sData = StringTrimRight(StringRegExpReplace(StringTrimLeft($xBytes, 2), "(.{" & $iStride & "})", "\1@"), 1)
    $avData = StringSplit($sData, "@")

    $hFile = FileOpen($sOutputFile, 2)
    If @error Then Return SetError(1, 1, 0)
    
    For $i = 1 To $avData[0]
        FileWrite($hFile, $avData[$i] & @CRLF)
    Next
    
    FileClose($hFile)
EndIf

if $method=2 Then
;~ Method 2 by replacing and returning array directly
;~  $sData = StringTrimRight(StringRegExpReplace(StringTrimLeft($xBytes, 2), "(.{" & $iStride & "})", "\1@"), 1)
;~     $avData = StringSplit($sData, "@")
    $avData=stringregexp($xBytes, ".{1," & $iStride & "}+", 3)

    $hFile = FileOpen($sOutputFile, 2)
    If @error Then Return SetError(1, 1, 0)
    
    For $i = 1 To $avData[0]
        FileWrite($hFile, $avData[$i] & @CRLF)
    Next
    
    FileClose($hFile)
EndIf

    _GDIPlus_BitmapUnlockBits($hBmp, $tBD)
    _WinAPI_DeleteObject($hBmp)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    return $avData
EndFunc   ;==>_GetImagePixels

Exit

CALCULATOR.bmp

Share this post


Link to post
Share on other sites
Malkey

If $method = 2 Then

    $avData = StringRegExp($xBytes, ".{1," & $iStride & "}+", 3)

    $hFile = FileOpen($sOutputFile, 2)
    If @error Then Return SetError(1, 1, 0)

    For $i = 1 To $avData[0]
        FileWrite($hFile, $avData[$i] & @CRLF)
    Next

    FileClose($hFile)
EndIf

For $i = 1 To $avData[0]

Wrong.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.