如何为AutoIt和PowerShell获得相同的base64编码?
我使用AutoIt获取字符串的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编码而不是
#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==