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

    • X_xkijux_x
      By X_xkijux_x
      Ok so im using this program. clarify for school. I would like to have a program that takes every word i type in microsoft word and searches on it in claryfi. is this possible. I would like to have the program not stopping me from typing more after that word. Like when i type a word it auto search it on clarify without making me stop typing and if i want to change i can do that and if im fine that word i can just keep typing and it will search after the next word. 
    • Miliardsto
      By Miliardsto
      Is this possible to make program works like in diagram? There is so much encryption methods and UDFs are they give security? If the $Address will be crypted with some encryption algorithm could be possible to get the value of $Address in easy way? Of course We know its easy too look into autoit code and get value of variable and so We dont want to anyone see $Address value - there are functions Could func1.au3, func2.au3.. be for example func1.php or other type of file? As we know .php files are unnable to see. For example func1 would be read by FileRead() and then Execute() Is this generally possible to do?
      Will it give secure?
      What do you think about? Maybe there is something wrong in this concept or missed.

    • JaredStroeb
      By JaredStroeb
      I need to open an application and send it keys in Session 0.  I have exe's working locally, I can see the application open in session 0 through interactive services, but my send commands do not go to the application.  The following article running-autoit-session-0, directs me to use ControlSend() however my application has no controls that can be identified by AutoIt v3 Window Info.  Get All Windows Controls also returned nothing for the application's handle.  
      What are my options?  
      Can this be done with AutoIt?
      Is there a different "relatively simple" library/tool to use? (I am familiar with C# if there is a viable library there )

       
    • nassausky
      By nassausky
      Hey all,
      Has anyone created any queries for youtube? I was thinking it might be something like this but can't quite figure it out:
      $oIE = _IECreateEmbedded() _IENavigate($oIE,"https://www.youtube.com") Local $oForms = _IETagNameGetCollection($oIE, "form") Local $sTxt = "" For $oForm In $oForms If $oForm.id = "masthead-search" Then $oInputs = _IETagNameGetCollection($oIE, "input") For $oInput In $oInputs If $oInput.id = "masthead-search-term" Then _IEFormElementSetValue($oInput, "cards") _IEFormSubmit($oForm) EndIf Next EndIf Next  
    • Skysnake
      By Skysnake
      Scite comes up occasional, almost incidentally, in some support topics.  I have not found a "Scite" topic in the forums, so this is where I will start.  I have recently been using Scite intensively, specifically with a large project and I have certain issues.  I know that Scite is not an AutoIt product, but it is so closely integrated to the core release that it makes sense to raise issues and request support here.  If this is not the right please refer me to the right forum.
      Thx
       
      Skysnake