How to get base64 encoding the same for AutoIt and PowerShell?
I use Ward's AutoIt Machine Code Algorithm Collection to get base64 encoding of a string in AutoIt:
#Include "Base64.au3"
Dim $Encode = _Base64Encode("ps")
MsgBox(0, 'Base64 Encode Data', $Encode)
The result:
cHM=
PowerShell code to get the base64 encoding of the same string "ps":
$commands = 'ps'
$bytes = [System.Text.Encoding]::Unicode.GetBytes($commands)
$encodedString = [Convert]::ToB开发者_Python百科ase64String($bytes)
$encodedString
What I got is:
cABzAA==
The result from PowerShell is what I want. How to get the same result using AutoIt? I guess this is a character encoding issue.
When I ran this script:
#Include "Base64.au3"
$Decode = _Base64Decode("cABzAA==")
ConsoleWrite($Decode & @CRLF)
I get the result: 0x70007300. Basically, this means there is a '70' character (p), a '00' character (nul), a '73' character (s), '00' character. You can easily recreate this behavior in AutoIt with a function like this:
#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
The result is: cABzAA==
Somewhat hack-ish, but I'd say it is preferred over full Unicode encoding if that's not what you will ever need.
#Include "Base64.au3"
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>
Dim $Encode = _Base64Encode(StringToBinary("ps", $SB_UTF16LE))
MsgBox(0, 'Base64 Encode Data', $Encode)
This will give what you want :
cABzAA==
Use ASCII encoding instead of Unicode:
$bytes = [System.Text.Encoding]::ASCII.GetBytes($commands)
精彩评论