carl1905

[Solved] Extracting text from string and reinsert it.

12 posts in this topic

#1 ·  Posted (edited)

Hi, I'm looking for a way to extract specific binary text data from string(except between "[", "]") and convert it.

And put it back to text. How can I do it? Can someone help me?

Example

$text = "[1F010005300020FF]82CD0A[030005300020FF]8177[1F12010000E6300020FF]8178[1F030000300020FF]82F00A8A6F82A682DC82"

Rearrange the text like below

[1F010005300020FF]
0x82CD0A            =>  StringToBinary(0x82CD0A) == A
[030005300020FF]
0x8177          =>  StringToBinary(0x8177) == B
[1F12010000E6300020FF]
0x8178          =>  StringToBinary(0x8178) == C
[1F030000300020FF]
0x82F00A8A6F82A682DC82  =>  StringToBinary(0x82F00A8A6F82A682DC82) == D

$output = "[1F010005300020FF]A[030005300020FF]B[1F12010000E6300020FF]C[1F030000300020FF]D"

 

Edited by carl1905

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

Hi, im maybe wrong but try that :

 

$text = "[1F010005300020FF]82CD0A[030005300020FF]8177[1F12010000E6300020FF]8178[1F030000300020FF]82F00A8A6F82A682DC82"

#include <Array.au3>

Func _ArrayAddColumns(ByRef $aArr, $iNumColToAdd = 1)
    If IsArray($aArr) = 0 Then Return SetError(1, 0, -1) ; Filter out non-array
    If $iNumColToAdd < 1 Then Return SetError(2, 0, -1) ; $iNumColToAdd must be greater than zero to add a column.
    If UBound($aArr, 0) > 2 Then Return SetError(3, 0, -1) ; Only allows a 1d or 2d array pass this line.

    If UBound($aArr, 0) = 1 Then ; ====== For 1d array ========
        Local $aRet[UBound($aArr)][$iNumColToAdd + 1] ; Create new 2d array.
        For $r = 0 To UBound($aArr) - 1
            $aRet[$r][0] = $aArr[$r]
        Next
    Else ; ======= For 2d array ============
        Local $aRet = $aArr ; So that ByRef $aArr is not altered outside of function.
        ReDim $aRet[UBound($aRet)][UBound($aRet, 2) + $iNumColToAdd] ; ReDim 2d array only.
    EndIf

    Return $aRet
EndFunc   ;==>_ArrayAddColumns

$split = StringSplit($text,"[]")
_ArrayDisplay($split, "v1")

$split = _ArrayAddColumns($split)
For $i = 1 To Ubound($split) - 1
    $split[$i][1] = BinaryToString("0x" & $split[$i][0])
    $i=$i+1
Next
_ArrayDisplay($split, "v2")

$fill = ""
For $i = 2 to Ubound($split) - 1
    $fill = $fill & "[" & $split[$i][0] & "]" & $split[$i+1][1]
    $i=$i+1
Next
msgbox(0,"Output",$fill)

 

Edit :

$split[$i][1] = BinaryToString("0x" & $split[$i][0], 2);<======= $SB_UTF16LE (2) = binary data is UTF16 Little Endian
$split[$i][1] = BinaryToString("0x" & $split[$i][0], 3);<======= $SB_UTF16BE (3) = binary data is UTF16 Big Endian

 

Edited by Synapsee
1 person likes this

Share this post


Link to post
Share on other sites

Check out StringRegExpReplace()

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

$text = "[1F010005300020FF]82CD0A[030005300020FF]8177[1F12010000E6300020FF]8178[1F030000300020FF]82F00A8A6F82A682DC82"

$text = StringReplace($text, "]82CD0A[", "]A[")             ;A
$text = StringReplace($text, "]8177[", "]B[")               ;B
$text = StringReplace($text, "]8178[", "]C[")               ;C
$text = StringReplace($text, "]82F00A8A6F82A682DC82", "]D") ;D

ConsoleWrite($text & @CRLF)

 

Edited by AndyG

Share this post


Link to post
Share on other sites

#5 ·  Posted (edited)

5 hours ago, Synapsee said:

Hi, im maybe wrong but try that :

Thanks for your reply. However, the last one word is missing. And can the output text be arranged in row? Not column.

#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <FileConstants.au3>
Global Const $CP_SHIFT_JIS = 932

$text = "[1F010005300020FF]82CD0A[030005300020FF]8177[1F12010000E6300020FF]8178[1F030000300020FF]82F00A8A6F82A682DC82"

Func _CodepageStructToString($tText, $iCodepage)
    Local $aResult = DllCall("kernel32.dll", "int", "MultiByteToWideChar", "uint", $iCodepage, "dword", 0, "struct*", $tText, "int", DllStructGetSize($tText), _
                                "ptr", 0, "int", 0)
    Local $tWstr = DllStructCreate("wchar[" & $aResult[0] & "]")
    $aResult = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", "uint", $iCodepage, "dword", 0, "struct*", $tText, "int", DllStructGetSize($tText), _
                        "struct*", $tWstr, "int", $aResult[0])
    Return DllStructGetData($tWstr, 1)
EndFunc

Func _ArrayAddColumns(ByRef $aArr, $iNumColToAdd = 1)
    If IsArray($aArr) = 0 Then Return SetError(1, 0, -1) ; Filter out non-array
    If $iNumColToAdd < 1 Then Return SetError(2, 0, -1) ; $iNumColToAdd must be greater than zero to add a column.
    If UBound($aArr, 0) > 2 Then Return SetError(3, 0, -1) ; Only allows a 1d or 2d array pass this line.

    If UBound($aArr, 0) = 1 Then ; ====== For 1d array ========
        Local $aRet[UBound($aArr)][$iNumColToAdd + 1] ; Create new 2d array.
        For $r = 0 To UBound($aArr) - 1
            $aRet[$r][0] = $aArr[$r]
        Next
    Else ; ======= For 2d array ============
        Local $aRet = $aArr ; So that ByRef $aArr is not altered outside of function.
        ReDim $aRet[UBound($aRet)][UBound($aRet, 2) + $iNumColToAdd] ; ReDim 2d array only.
    EndIf

    Return $aRet
EndFunc   ;==>_ArrayAddColumns

$split = StringSplit($text,"[]")
$Str = ""
$fill = ""
$split = _ArrayAddColumns($split)

For $i = 1 To Ubound($split) - 1
    $split[$i][1] = Binary("0x" & $split[$i][0])
    ;msgbox(0,"Output",$split[$i][1])
    Local $tInp = DllStructCreate("byte[" & BinaryLen($split[$i][1]) & "]")
    DllStructSetData($tInp, 1, $split[$i][1])
    Local $Str  = _CodepageStructToString($tInp, $CP_SHIFT_JIS)
          $Str  = StringRegExpReplace($Str ,@CRLF,"<cf>")
          $Str  = StringRegExpReplace($Str ,@LF,"<lf>")
          $Str  = StringRegExpReplace($Str ,@CR,"<cr>")
          $split[$i][1] = $Str  & @CRLF
          $i=$i+1
Next

$fill = ""
For $i = 2 to Ubound($split) - 1
    $fill = $fill & "[" & $split[$i][0] & "]" & $split[$i+1][1]
    $i=$i+1
Next
msgbox(0,"Output",$fill)
FileWrite ("test.txt", $fill)
FileClose ("test.txt")
TrayTip ("Exporter", "Finish!", 3)
sleep (3000)

 

Edited by carl1905

Share this post


Link to post
Share on other sites

#6 ·  Posted (edited)

what is the "test.txt" expected ? u want that :

Quote

[1F010005300020FF][030005300020FF][1F12010000E6300020FF][1F030000300020FF]

は<lf>『』を<lf>覚えま・

Or something else ?

Edited by Synapsee

Share this post


Link to post
Share on other sites

#7 ·  Posted (edited)

1 hour ago, Synapsee said:

what is the "test.txt" expected ? u want that :

Or something else ?

The one that I want is this form.

[1F010005300020FF]<lf>[030005300020FF][1F12010000E6300020FF][1F030000300020FF]<lf>覚えま・

 

Edited by carl1905

Share this post


Link to post
Share on other sites

#8 ·  Posted (edited)

Ah, I missed some last three byte. 0xB582BD

text = "[1F010005300020FF]82CD0A[030005300020FF]8177[1F12010000E6300020FF]8178[1F030000300020FF]82F00A8A6F82A682DC82B582BD"

So, this is the corrected form.

[1F010005300020FF]<lf>[030005300020FF][1F12010000E6300020FF][1F030000300020FF]<lf>覚えました

 

Edited by carl1905

Share this post


Link to post
Share on other sites

Not sure, but try that one :

Local $text = "[1F010005300020FF]82CD0A[030005300020FF]8177[1F12010000E6300020FF]8178[1F030000300020FF]82F00A8A6F82A682DC82"
$out = Execute('"' & StringRegExpReplace($text, "\]\K([^\]]+)(?=\[|$)",  """ & BinaryToString(""0x\1"") & """) & '"')
MsgBox(0, "", $out)

 

Share this post


Link to post
Share on other sites

#10 ·  Posted (edited)

Another examples..

$text2 = "[09020000390011300020FF]82BB82A482CB81428DC58CE382CC90B897EC82C60A8C5F96F182B782E9914F82C90C[1F090200003A0011300020FF]90D882E897A382B582BD82A082C682CC90A28A4582C982C282A282C40A92B282D782C482A882A282BD95FB82AA82A282A282ED82CB"

$result2 = "[09020000390011300020FF]そうね。最後の精霊と<lf>契約する前に�[1F090200003A0011300020FF]切り離したあとの世界について<lf>調べておいた方がいいわね"

$text3 = "814581458145[090200003B0011300020FF]82B182EA82CD8145814581450A88C8914F82E682E88C8382B582AD82C882C182C482A282C882A282A98148"
$result3 = "[090200003B0011300020FF]これは・・・<lf>以前より激しくなっていないか?"

However, $test3 starts with "814581458145" but at the $result3 it disappears.

Maybe this is the corrected form.

#result3_fix = "・・・[090200003B0011300020FF]これは・・・<lf>以前より激しくなっていないか?"

 

Edited by carl1905

Share this post


Link to post
Share on other sites
#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <FileConstants.au3>

Global Const $CP_SHIFT_JIS = 932

Func _CodepageStructToString($tText, $iCodepage)
    Local $aResult = DllCall("kernel32.dll", "int", "MultiByteToWideChar", "uint", $iCodepage, "dword", 0, "struct*", $tText, "int", DllStructGetSize($tText), _
                                "ptr", 0, "int", 0)
    Local $tWstr = DllStructCreate("wchar[" & $aResult[0] & "]")
    $aResult = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", "uint", $iCodepage, "dword", 0, "struct*", $tText, "int", DllStructGetSize($tText), _
                        "struct*", $tWstr, "int", $aResult[0])
    Return DllStructGetData($tWstr, 1)
EndFunc

Func _ArrayAddColumns(ByRef $aArr, $iNumColToAdd = 1)
    If IsArray($aArr) = 0 Then Return SetError(1, 0, -1) ; Filter out non-array
    If $iNumColToAdd < 1 Then Return SetError(2, 0, -1) ; $iNumColToAdd must be greater than zero to add a column.
    If UBound($aArr, 0) > 2 Then Return SetError(3, 0, -1) ; Only allows a 1d or 2d array pass this line.

    If UBound($aArr, 0) = 1 Then ; ====== For 1d array ========
        Local $aRet[UBound($aArr)][$iNumColToAdd + 1] ; Create new 2d array.
        For $r = 0 To UBound($aArr) - 1
            $aRet[$r][0] = $aArr[$r]
        Next
    Else ; ======= For 2d array ============
        Local $aRet = $aArr ; So that ByRef $aArr is not altered outside of function.
        ReDim $aRet[UBound($aRet)][UBound($aRet, 2) + $iNumColToAdd] ; ReDim 2d array only.
    EndIf

    Return $aRet
EndFunc   ;==>_ArrayAddColumns

$text1 = "[1F010005300020FF]82CD0A[030005300020FF]8177[1F12010000E6300020FF]8178[1F030000300020FF]82F00A8A6F82A682DC82B582BD"
$text2 = "[09020000390011300020FF]82BB82A482CB81428DC58CE382CC90B897EC82C60A8C5F96F182B782E9914F82C90C[1F090200003A0011300020FF]90D882E897A382B582BD82A082C682CC90A28A4582C982C282A282C40A92B282D782C482A882A282BD95FB82AA82A282A282ED82CB"
$text3 = "814581458145[090200003B0011300020FF]82B182EA82CD8145814581450A88C8914F82E682E88C8382B582AD82C882C182C482A282C882A282A98148"

;v1 without @CRLF
$file = "test without crlf.txt"
$text = $text1 & $text2 & $text3
MainFunc($text, $file)

;v2 with @CRLF
$file = "test with crlf.txt"
MainFunc($text1, $file)
FileWrite ($file, @CRLF)
FileClose ($file)
MainFunc($text2 , $file)
FileWrite ($file, @CRLF)
FileClose ($file)
MainFunc($text3, $file)
FileWrite ($file, @CRLF)
FileClose ($file)

Func MainFunc($text, $file)

    $split = StringSplit($text,"[]")
    $Str = ""
    $fill = ""
    $split = _ArrayAddColumns($split)
    ;_ArrayDisplay($split)

    if StringInStr($text, "[") = 1 Then
        $y = 3
    Else
        $y = 1
    EndIf

    For $i = $y-1 To Ubound($split) - 1
        $split[$i][1] = "[" & $split[$i][0] & "]"
        $i=$i+1
        $split[$i][1] = Binary("0x" & $split[$i][0])
        ;msgbox(0,"Output",$split[$i][1])
        Local $tInp = DllStructCreate("byte[" & BinaryLen($split[$i][1]) & "]")
        DllStructSetData($tInp, 1, $split[$i][1])
        Local $Str  = _CodepageStructToString($tInp, $CP_SHIFT_JIS)
              $Str  = StringRegExpReplace($Str ,@CRLF,"<cf>")
              $Str  = StringRegExpReplace($Str ,@LF,"<lf>")
              $Str  = StringRegExpReplace($Str ,@CR,"<cr>")
              $split[$i][1] = $Str
    Next
    ;_ArrayDisplay($split)

    $fill = ""
    For $i = 1 to Ubound($split) - 1
        $fill = $fill & "" & $split[$i][1]
    Next

    ;msgbox(0,"Output",$fill)

    FileWrite ($file, $fill)
    FileClose ($file)

EndFunc

 

1 person likes this

Share this post


Link to post
Share on other sites
10 hours ago, Synapsee said:
#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <FileConstants.au3>

Global Const $CP_SHIFT_JIS = 932

Func _CodepageStructToString($tText, $iCodepage)
    Local $aResult = DllCall("kernel32.dll", "int", "MultiByteToWideChar", "uint", $iCodepage, "dword", 0, "struct*", $tText, "int", DllStructGetSize($tText), _
                                "ptr", 0, "int", 0)
    Local $tWstr = DllStructCreate("wchar[" & $aResult[0] & "]")
    $aResult = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", "uint", $iCodepage, "dword", 0, "struct*", $tText, "int", DllStructGetSize($tText), _
                        "struct*", $tWstr, "int", $aResult[0])
    Return DllStructGetData($tWstr, 1)
EndFunc

Func _ArrayAddColumns(ByRef $aArr, $iNumColToAdd = 1)
    If IsArray($aArr) = 0 Then Return SetError(1, 0, -1) ; Filter out non-array
    If $iNumColToAdd < 1 Then Return SetError(2, 0, -1) ; $iNumColToAdd must be greater than zero to add a column.
    If UBound($aArr, 0) > 2 Then Return SetError(3, 0, -1) ; Only allows a 1d or 2d array pass this line.

    If UBound($aArr, 0) = 1 Then ; ====== For 1d array ========
        Local $aRet[UBound($aArr)][$iNumColToAdd + 1] ; Create new 2d array.
        For $r = 0 To UBound($aArr) - 1
            $aRet[$r][0] = $aArr[$r]
        Next
    Else ; ======= For 2d array ============
        Local $aRet = $aArr ; So that ByRef $aArr is not altered outside of function.
        ReDim $aRet[UBound($aRet)][UBound($aRet, 2) + $iNumColToAdd] ; ReDim 2d array only.
    EndIf

    Return $aRet
EndFunc   ;==>_ArrayAddColumns

$text1 = "[1F010005300020FF]82CD0A[030005300020FF]8177[1F12010000E6300020FF]8178[1F030000300020FF]82F00A8A6F82A682DC82B582BD"
$text2 = "[09020000390011300020FF]82BB82A482CB81428DC58CE382CC90B897EC82C60A8C5F96F182B782E9914F82C90C[1F090200003A0011300020FF]90D882E897A382B582BD82A082C682CC90A28A4582C982C282A282C40A92B282D782C482A882A282BD95FB82AA82A282A282ED82CB"
$text3 = "814581458145[090200003B0011300020FF]82B182EA82CD8145814581450A88C8914F82E682E88C8382B582AD82C882C182C482A282C882A282A98148"

;v1 without @CRLF
$file = "test without crlf.txt"
$text = $text1 & $text2 & $text3
MainFunc($text, $file)

;v2 with @CRLF
$file = "test with crlf.txt"
MainFunc($text1, $file)
FileWrite ($file, @CRLF)
FileClose ($file)
MainFunc($text2 , $file)
FileWrite ($file, @CRLF)
FileClose ($file)
MainFunc($text3, $file)
FileWrite ($file, @CRLF)
FileClose ($file)

Func MainFunc($text, $file)

    $split = StringSplit($text,"[]")
    $Str = ""
    $fill = ""
    $split = _ArrayAddColumns($split)
    ;_ArrayDisplay($split)

    if StringInStr($text, "[") = 1 Then
        $y = 3
    Else
        $y = 1
    EndIf

    For $i = $y-1 To Ubound($split) - 1
        $split[$i][1] = "[" & $split[$i][0] & "]"
        $i=$i+1
        $split[$i][1] = Binary("0x" & $split[$i][0])
        ;msgbox(0,"Output",$split[$i][1])
        Local $tInp = DllStructCreate("byte[" & BinaryLen($split[$i][1]) & "]")
        DllStructSetData($tInp, 1, $split[$i][1])
        Local $Str  = _CodepageStructToString($tInp, $CP_SHIFT_JIS)
              $Str  = StringRegExpReplace($Str ,@CRLF,"<cf>")
              $Str  = StringRegExpReplace($Str ,@LF,"<lf>")
              $Str  = StringRegExpReplace($Str ,@CR,"<cr>")
              $split[$i][1] = $Str
    Next
    ;_ArrayDisplay($split)

    $fill = ""
    For $i = 1 to Ubound($split) - 1
        $fill = $fill & "" & $split[$i][1]
    Next

    ;msgbox(0,"Output",$fill)

    FileWrite ($file, $fill)
    FileClose ($file)

EndFunc

 

Thank you!!

1 person likes this

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

  • Similar Content

    • fosil
      By fosil
      Hi everyone.

      I'm currently working a program that constantly prints out log files through "consolewrite" and the "#AutoIt3Wrapper_Change2CUI=y" wrapper.

      Part of this program requires me to run a batch script.

      My issue is the batch script launches from the same window as consolewrite. I need the batch file to be launched through a different window as currently this causes an issue with the logs (which need to be very precise) but also causes the batch file to produce some funny behavior...

      Does anyone know how I can force the file to run on a second DOS window?

      Thanks in advance!!!
       
      Edit: Im using the "run" command if that helps. I tried "shellexecute" but that seemed to not launch the batch scripts at all.
    • nacerbaaziz
      By nacerbaaziz
      Hello guys
      I have an inquiry regarding bass.dll
      I wanted to record an audio file and did not know the way
      As well as I want to save the file after applying the effects
      can you help me?
      am sorry for my english
      With my greetings and best wishes
    • kenny4896
      By kenny4896
      Hi All,
      I tried my best to looking a solution from this forum or others, but I have no luck. The imagesearch dll working fine in my 64 bits machine, whenever I move the scripts to Win 7 (32 bits), it crashes. ImageSearchDLL.dll, ImageSearch.au3 and my simple scripts are in the same working directory. For win 7 (32 bits) machine, I'm using 32 bits ImageSearchdll.dll, the simple scripts as below:
      #include <ImageSearch.au3>
      Global $y = 0, $x = 0
      Local $search = _ImageSearch("C:\Program Files\AutoIt3\Examples\Images\mypc.PNG", 0, $x, $y, 0)
      if $search = 1 then
         MsgBox(0,"Found","Found my target here..." & $x & "," & $y)
         MouseMove($x, $y, 10)
      Else
         msgbox(0, "Not found","")
      Endif
      However, I received error message below when running the script. Anyone here got clue? 
      Problem Event Name:    APPCRASH
        Application Name:    AutoIt3.exe
        Application Version:    3.3.14.2
        Application Timestamp:    55fc1979
        Fault Module Name:    AutoIt3.exe
        Fault Module Version:    3.3.14.2
        Fault Module Timestamp:    55fc1979
        Exception Code:    c0000005
        Exception Offset:    00020e42
        OS Version:    6.1.7601.2.1.0.256.4
        Locale ID:    17417
        Additional Information 1:    0a9e
        Additional Information 2:    0a9e372d3b4ad19135b953a78882e789
        Additional Information 3:    0a9e
        Additional Information 4:    0a9e372d3b4ad19135b953a78882e789
    • Hanukka
      By Hanukka
      Hello there,
      https://stackoverflow.com/questions/901712/how-to-check-whether-a-checkbox-is-checked-in-jquery
      I want to check the checkbox in the frame which pops up after choosing "run code snippet" option. ( Internet Explorer one would be prefered )
      Can you please please send the right code or some snippet here.. 
    • Fhelipe
      By Fhelipe
      Nothing More