carl1905 Posted April 27, 2016 Posted April 27, 2016 (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 April 28, 2016 by carl1905
Synapsee Posted April 27, 2016 Posted April 27, 2016 (edited) Hi, im maybe wrong but try that : expandcollapse popup$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 April 27, 2016 by Synapsee carl1905 1
AndyG Posted April 27, 2016 Posted April 27, 2016 (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 April 27, 2016 by AndyG
carl1905 Posted April 27, 2016 Author Posted April 27, 2016 (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. expandcollapse popup#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 April 27, 2016 by carl1905
Synapsee Posted April 27, 2016 Posted April 27, 2016 (edited) what is the "test.txt" expected ? u want that : Quote [1F010005300020FF][030005300020FF][1F12010000E6300020FF][1F030000300020FF] は<lf>『』を<lf>覚えま・ Or something else ? Edited April 27, 2016 by Synapsee
carl1905 Posted April 27, 2016 Author Posted April 27, 2016 (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 April 27, 2016 by carl1905
carl1905 Posted April 27, 2016 Author Posted April 27, 2016 (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 April 27, 2016 by carl1905
jguinch Posted April 27, 2016 Posted April 27, 2016 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) Spoiler Network configuration UDF, _DirGetSizeByExtension, _UninstallList Firefox ConfigurationArray multi-dimensions, Printer Management UDF
carl1905 Posted April 27, 2016 Author Posted April 27, 2016 (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 April 27, 2016 by carl1905
Synapsee Posted April 28, 2016 Posted April 28, 2016 expandcollapse popup#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 carl1905 1
carl1905 Posted April 28, 2016 Author Posted April 28, 2016 10 hours ago, Synapsee said: expandcollapse popup#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!! Synapsee 1
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now