如何为AutoIt和PowerShell获得相同的base64编码?

如何为AutoIt和PowerShell获得相同的base64编码?,powershell,encoding,base64,autoit,Powershell,Encoding,Base64,Autoit,我使用AutoIt获取字符串的base64编码: #Include "Base64.au3" Dim $Encode = _Base64Encode("ps") MsgBox(0, 'Base64 Encode Data', $Encode) 结果是: cHM= 获取相同字符串“ps”的base64编码的PowerShell代码: 我得到的是: cABzAA== PowerShell的结果就是我想要的。如何使用AutoIt获得相同的结果?我想这是一个字符编码问题。使用ASCII编码而不是

我使用AutoIt获取字符串的base64编码:

#Include "Base64.au3"

Dim $Encode = _Base64Encode("ps")
MsgBox(0, 'Base64 Encode Data', $Encode)
结果是:

cHM=
获取相同字符串“ps”的base64编码的PowerShell代码:

我得到的是:

cABzAA==

PowerShell的结果就是我想要的。如何使用AutoIt获得相同的结果?我想这是一个字符编码问题。

使用ASCII编码而不是Unicode编码:

$bytes = [System.Text.Encoding]::ASCII.GetBytes($commands)

当我运行此脚本时:

#Include "Base64.au3"

$Decode = _Base64Decode("cABzAA==")
ConsoleWrite($Decode & @CRLF)
我得到的结果是: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
结果是:卡布扎==


有点像黑客,但如果你永远都不需要完整的Unicode编码,我会说它比完整的Unicode编码更可取。

嗨,Kwatkins先生,对我来说,PowerShell的结果是正确的。我需要AutoIt的这个结果。所以我不能更改PowerShell代码。啊,对不起,误读了。我不知道AutoIt,但是它是否有一个方法来编码以64字节为基数的字节而不是字符串?在这种情况下,您可以自己使用Unicode编码手动将字符串转换为字节,并将其传入.TL;DR版本:由于PowerShell是.NET,所以它是UCS16LE(UTF16),因此默认情况下编码为双字节。
#Include "Base64.au3"    
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>

Dim $Encode = _Base64Encode(StringToBinary("ps", $SB_UTF16LE))
MsgBox(0, 'Base64 Encode Data', $Encode)
#Include "Base64.au3"    
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>

Dim $Encode = _Base64Encode(StringToBinary("ps", $SB_UTF16LE))
MsgBox(0, 'Base64 Encode Data', $Encode)
cABzAA==