如何从AutoIt获得与PowerShell相同的base64编码结果

Jus*_*ner 4 powershell base64 encoding autoit

我使用Ward的AutoIt机器码算法集合来获取AutoIt中字符串的base64编码.代码如下:

#Include "Base64.au3"

Dim $Encode = _Base64Encode("ps")
MsgBox(0, 'Base64 Encode Data', $Encode)
Run Code Online (Sandbox Code Playgroud)

运行时,我得到了结果:

cHM=
Run Code Online (Sandbox Code Playgroud)

然后我使用以下PowerShell代码获取相同字符串"ps"的base64编码:

$commands = 'ps'
$bytes = [System.Text.Encoding]::Unicode.GetBytes($commands)
$encodedString = [Convert]::ToBase64String($bytes)
$encodedString
Run Code Online (Sandbox Code Playgroud)

我得到的是:

cABzAA==
Run Code Online (Sandbox Code Playgroud)

事实上,PowerShell的结果就是我想要的.我想知道如何使用AutoIt获得相同的结果?我想这是一个字符编码问题,但我不确定.

谢谢.

Jos*_*ond 5

当我运行这个脚本时:

#Include "Base64.au3"

$Decode = _Base64Decode("cABzAA==")
ConsoleWrite($Decode & @CRLF)
Run Code Online (Sandbox Code Playgroud)

我得到的结果是:0x70007300.基本上,这意味着存在'70'字符(p),'00'字符(nul),'73'字符,'00'字符.您可以使用以下函数在AutoIt中轻松重新创建此行为:

#Include "Base64.au3"

Dim $Encode = _Base64WEncode("ps")
ConsoleWrite($Encode & @CRLF)

Func _Base64WEncode($string)
    Local $result = ""
    Local $arr = StringSplit($string, "")
    For $i = 1 To UBound($arr) - 1
        $result &= $arr[$i] & Chr(0)
    Next
    $result = _Base64Encode($result)
    Return $result
EndFunc
Run Code Online (Sandbox Code Playgroud)

结果是:cABzAA ==

有些hack-ish,但我认为它比完整的Unicode编码更受欢迎,如果这不是你将需要的.

  • TL; DR版本:由于是.NET,PowerShell是UCS16LE(UTF16),所以它默认编码为双字节. (2认同)