Jump to content

Reverse Byte Order of String (UTF16-LE <> UTF16-BE transformation)


KaFu
 Share

Recommended Posts

Hiho Forum :),

I'm looking for a way to reverse the byte order of a string (for UTF16-LE <> UTF16-BE transformation). I've found the function LCMapString which should imho do the trick, but can't get it to work correctly. Maybe one of the real pros want to take a look :whistle:...

Edit:

Sorry, much too complicated... this already does the trick >_< ...

$in = "test22"
ConsoleWrite(StringToBinary($in, 2) & @CRLF)
ConsoleWrite(StringToBinary($in, 3) & @CRLF)

; LCMapString function ; http://msdn.microsoft.com/en-us/library/dd318700 $in = "test22" $t_in = DllStructCreate("wchar[" & StringLen($in) & "]") DllStructSetData($t_in, 1, $in) ConsoleWrite(StringToBinary(DllStructGetData($t_in, 1)) & @CRLF) $t_out = DllStructCreate("wchar[" & StringLen($in) & "]") ; LCMAP_BYTEREV := 0x800 $iRes = DllCall("kernel32.dll", "int", "LCMapStringW", "uint", 0, "dword", 0x800, "struct*", $t_in, "int", StringLen($in), "ptr", DllStructGetPtr($t_out), "int", StringLen($in)) ConsoleWrite($iRes[0] & @CRLF & $iRes[5] & @CRLF & $iRes[6] & @CRLF) ConsoleWrite(DllStructCreate("wchar[" & $iRes[6] & "]", $iRes[5]) & @CRLF & @CRLF) ConsoleWrite(StringToBinary(DllStructGetData($t_in, 1)) & @CRLF) ConsoleWrite(StringToBinary(DllStructGetData($t_out, 1)) & @CRLF)

Edited by KaFu
Link to comment
Share on other sites

So it's solved? I'm not in a position to run the code.

UDF List:

 
_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_ArrayFilter/_ArrayReduce_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 22/04/2018

Link to comment
Share on other sites

Yes it is :), was looking for a new way to find strings in files for SMF. Look at line "For $i = 1 To 4" to see where it's applied.

#include <WinAPI.au3>

Global $__FileSearchContent_iBufferSize = 1024 * 20 ; 20 KB Buffer
Global $__FileSearchContent_tBuffer = DllStructCreate("byte[" & $__FileSearchContent_iBufferSize & "]")

ConsoleWrite(__FileSearchContent(@ScriptFullPath, -1, "Test") & @CRLF)

Func __FileSearchContent($sFile, $iFileSize = -1, $sSearchterm = "")

    ; ConsoleWrite($sSearchterm & @TAB & $sFile & @TAB & $iFileSize & @CRLF)

    Local $hFile = DllCall("kernel32.dll", 'ptr', 'CreateFileW', 'wstr', "\\?\" & $sFile, 'dword', 0x80000000, 'dword', 0, 'ptr', 0, 'dword', 3, 'dword', 0x10000000, 'ptr', 0)
    If (@error) Or ($hFile[0] = Ptr(-1)) Then Return SetError(1, 0, 0)

    If IsKeyword($iFileSize) Or $iFileSize = -1 Then $iFileSize = _WinAPI_GetFileSizeEx($hFile[0])
    If $iFileSize = 0 Then
        DllCall("kernel32.dll", "bool", "CloseHandle", "handle", $hFile[0])
        Return SetError(2, 0, 0)
    EndIf

    Local $iBytesToRead, $iFileSizeLeftToRead = $iFileSize, $tBuffer, $aRet

    While 1

        If $iFileSizeLeftToRead < $__FileSearchContent_iBufferSize Then
            $iBytesToRead = $iFileSizeLeftToRead
            $tBuffer = DllStructCreate("byte[" & $iBytesToRead & "]")
        Else
            $iBytesToRead = $__FileSearchContent_iBufferSize
            $tBuffer = $__FileSearchContent_tBuffer
        EndIf

        $aRet = DllCall("kernel32.dll", "bool", "ReadFile", "handle", $hFile[0], "struct*", $tBuffer, "dword", $iBytesToRead, "dword*", 0, "ptr", 0)

        For $i = 1 To 4
            If StringRegExp(BinaryToString(DllStructGetData($tBuffer, 1), $i), $sSearchterm) Then
                DllCall("kernel32.dll", "bool", "CloseHandle", "handle", $hFile[0])
                Return 1
            EndIf
        Next

        $iFileSizeLeftToRead -= $aRet[4] ; Bytes read
        If $iFileSizeLeftToRead <= 0 Then ExitLoop ; EOF reached

        DllCall("kernel32.dll", "int", "SetFilePointerEx", "handle", $hFile[0], "int64", -1024, "int64*", 0, "dword", 1) ; roll-back 1024 bytes to address possible overlaps
        $iFileSizeLeftToRead += 1024

    WEnd

    DllCall("kernel32.dll", "bool", "CloseHandle", "handle", $hFile[0])

    Return 0

EndFunc   ;==>__FileSearchContent
Edited by KaFu
Link to comment
Share on other sites

  • 3 years later...
  • Moderators

haijie1223,

Please post in English in future - if necessary do as I did and use a translation site.

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
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
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...