#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
#SingleInstance ignore
Help(wParam, lParam, Msg)
{
MouseGetPos,,,, OutputVarControl
;~ IfEqual, OutputVarControl, Button1
;~ Help := "Will try to convert the input multiple times if detected as Hex/Binary."
ToolTip % Help
}
encodeUTF8( ByRef OutData, InData, inputEncoding, outputEncoding)
{
encoding := determineEncodingFlag(inputEncoding, "encrypt")
InDataLen := StrPutVar(InData, InData, "UTF-8") - 1
DllCall( "Crypt32.dll\CryptBinaryToStringW", UInt,&InData, UInt,InDataLen, UInt,encoding, UInt,0, UIntP,TChars, "CDECL Int" )
VarSetCapacity( OutData, Req := TChars * ( A_IsUnicode ? 2 : 1 ), 0 )
DllCall( "Crypt32.dll\CryptBinaryToStringW", UInt,&InData, UInt,InDataLen, UInt,encoding, Str,OutData, UIntP,Req, "CDECL Int" )
Return TChars
}
determineEncodingFlag(encoding, crypt)
{
if(crypt = "encrypt")
{
if(encoding = "Binary")
return 0x00000002
else if(encoding = "BASE64")
return 0x40000001
else if(encoding = "Hexadecimal")
return 0x00000004
}
else if (crypt = "decrypt")
{
if(encoding = "Binary")
return 0x00000002
else if(encoding = "BASE64")
return 0x00000001
else if(encoding = "Hexadecimal")
return 0x00000008
}
}
StrPutVar(string, ByRef var, encoding)
{
; Ensure capacity.
VarSetCapacity( var, StrPut(string, encoding)
; StrPut returns char count, but VarSetCapacity needs bytes.
* ((encoding="utf-16"||encoding="cp1200") ? 2 : 1) )
; Copy or convert the string.
return StrPut(string, &var, encoding)
}
decodeUTF8( ByRef OutData, InData, inputEncoding)
{
encoding := determineEncodingFlag(inputEncoding, "decrypt")
DllCall( "Crypt32.dll\CryptStringToBinaryW", UInt,&InData, UInt,StrLen(InData), UInt,encoding, UInt,0, UIntP,Bytes, Int,0, Int,0, "CDECL Int" )
VarSetCapacity( OutData, Req := Bytes * ( A_IsUnicode ? 2 : 1 ), 0 )
DllCall( "Crypt32.dll\CryptStringToBinaryW", UInt,&InData, UInt,StrLen(InData), UInt,encoding, Str,OutData, UIntP,Req, Int,0, Int,0, "CDECL Int" )
OutData := StrGet(&OutData, "cp0")
Return Bytes
}
TxtToBin(txt)
{ ; http://www.autohotkey.com/board/topic/7835-ascii-binary-converter/?p=48740
Loop Parse, txt
{
Loop 8
{
bin := bin (Asc(A_LoopField) >> (8 - A_Index) & 1)
}
bin .= " "
}
return SubStr(bin, 1, (StrLen(bin) - 1))
}
BinToTxt(bin)
{ ; http://www.autohotkey.com/board/topic/7835-ascii-binary-converter/?p=48740
StringReplace, bin, bin, %A_Space%,,All
Loop Parse, bin
{
x += x + (A_LoopField = "1")
If !Mod(A_Index,8)
{
txt := txt Chr(x)
x = 0
}
}
Return txt
}
Rot13(string)
{ ; from LinearSpoon's Translation of The Worlds Shortest C Implementation of Rot13 http://rosettacode.org/wiki/Rot-13#AutoHotkey
Output := ""
Loop, Parse, string
{
a := ~Asc(A_LoopField)
Output .= Chr(~a-1//(~(a|32)//13*2-11)*13)
}
return Output
}
ascii2Decimal(string)
{
encoding := ""
Loop, Parse, string
{
encoding .= Asc(A_LoopField) . " "
}
return SubStr(encoding, 1, StrLen(encoding) - 1)
}
decimal2Ascii(string)
{
decoding := ""
Loop, Parse, string, %A_Space%
{
decoding .= Chr(A_LoopField)
}
return decoding
}
uriEncode(str)
{ ; v 0.3 / (w) 24.06.2008 by derRaphael / zLib-Style release http://www.autohotkey.com/board/topic/6199-url-encoding/?p=193258
b_Format := A_FormatInteger
data := ""
SetFormat,Integer,H
Loop,Parse,str
if ((Asc(A_LoopField)>0x7f) || (Asc(A_LoopField)<0x30) || (asc(A_LoopField)=0x3d))
data .= "%" . ((StrLen(c:=SubStr(ASC(A_LoopField),3))<2) ? "0" . c : c)
Else
data .= A_LoopField
SetFormat,Integer,%b_format%
return data
}
uriDecode(str)
{ ; v 0.1 / (w) 28.06.2008 by derRaphael / zLib-Style release http://www.autohotkey.com/board/topic/6199-url-encoding/?p=193258
Loop,Parse,str,`%
txt := (A_Index=1) ? A_LoopField : txt chr("0x" substr(A_LoopField,1,2)) SubStr(A_LoopField,3)
return txt
}
ConvertBase(InputBase, OutputBase, nptr)
{ ; came from somewhere very similar to http://www.autohotkey.com/board/topic/15951-base-10-to-base-36-conversion/?p=172786
static u := A_IsUnicode ? "_wcstoui64" : "_strtoui64"
static v := A_IsUnicode ? "_i64tow" : "_i64toa"
VarSetCapacity(s, 66, 0)
value := DllCall("msvcrt.dll\" u, "Str", nptr, "UInt", 0, "UInt", InputBase, "CDECL Int64")
DllCall("msvcrt.dll\" v, "Int64", value, "Str", s, "UInt", OutputBase, "CDECL")
return s
}
; Uses the ConvertBase function to convert formated numbers similar to the http://www.asciitohex.com/ site
Convert(inputBase, outputBase, inputNumber)
{
; Binary not created correctly if hex isn't inputed in 2 digit format.
if(inputBase = 16 && outputBase = 2)
inputNumber := standardizeHexInputFormatForBinaryOutput(inputNumber)
output := ""
Loop, Parse, inputNumber, %A_Space%
{
; convertBase ouput 0 for 16 base 0 when I need 00
temp := ConvertBase(inputBase, outputBase, A_LoopField)
if(temp = 0)
{
if(outputBase = 2)
temp := "00000000"
else if(outputBase = 16)
temp := "00"
}
output .= temp . " "
}
StringUpper, output, output
return SubStr(output, 1, (StrLen(output) - 1))
}
standardizeHexInputFormatForBinaryOutput(inputHex)
{
hex := ""
StringReplace, inputHex, inputHex, %A_Space%,,All
Loop, Parse, inputHex
{
if(A_Index != 1 && Mod(A_Index - 1, 2) = 0)
{
hex .= " " . A_LoopField
}
else
{
hex .= A_LoopField
}
}
return hex
}
convertInputToOutputEncoding(inputEncoding, string, outputEncoding)
{
if(inputEncoding = outputEncoding)
return string
; if the conversion is a base to base, i.e. 10(dec) to 16(hex) use the convert function
inputEncodingBase := determineEncodingBase(inputEncoding)
outputEncodingBase := determineEncodingBase(outputEncoding)
if(inputEncodingBase != 0 && outputEncodingBase != 0)
{
return Convert(inputEncodingBase, outputEncodingBase, string)
}
; convert any base64 to text
if(inputEncoding = "BASE64")
string := convertInputToText(string, inputEncoding)
; Non-base to base conversions
if(outputEncoding = "BASE64" && inputEncoding = "Text")
encodeUTF8(encoded, string, "BASE64", outputEncoding)
else if(outputEncoding = "BASE64")
encoded := ToBase64(string)
else if(outputEncoding = "Binary" && (inputEncoding = "Text" || inputEncoding = "BASE64"))
encoded := TxtToBin(string)
else if(outputEncoding = "Binary")
encodeUTF8(encoded, string, "Binary", outputEncoding)
else if(outputEncoding = "Decimal")
return ascii2Decimal(string)
else if(outputEncoding = "Hexadecimal")
encodeUTF8(encoded, string, "Hexadecimal", outputEncoding)
else if(outputEncoding = "ROT13")
return Rot13(string)
else if(outputEncoding = "URI")
return uriEncode(string)
else if(outputEncoding = "Text" && inputEncoding != "BASE64")
return convertInputToText(string, inputEncoding)
else if(outputEncoding = "Text" && inputEncoding = "BASE64")
return string
return encoded
}
determineEncodingBase(encoding)
{
if(encoding = "Binary")
return 2
else if(encoding = "Decimal")
return 10
else if(encoding = "Hexadecimal")
return 16
else
return 0
}
ToBase64(string)
{
static CharSet := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
; convert input to binary unless input is already binary
if((RegExMatch(string, "^(\d{8}\s?)*$")))
{
StringReplace, string, string, %A_Space%,,All
binary := string
}
else
{
binary := ""
Loop, Parse, string
{
; if the entire string is a number treat don't get the Ascii value of the numbers skip that step
; Pad output with zeros to each section has 8.
if string is not integer
binary .= SubStr("0000000" . ConvertBase(10, 2, Asc(A_LoopField)), -7, 8)
else
binary .= SubStr("0000000" . ConvertBase(10, 2, A_LoopField), -7, 8)
}
}
; If number of bytes(group of eight) isn't divisible by three bytes(24) add extra zeros until you have it.
temp := Mod(StrLen(binary), 24)
shortSection := (24 - temp)
binary := binary . SubStr("000000000000000000000000", 1, shortSection)
; if the last 24,18,12,6 are zero remove them
if(SubStr(binary, -23) = "000000000000000000000000")
binary := SubStr(binary, 1, StrLen(binary) - 24)
else if(SubStr(binary, -17) = "000000000000000000")
binary := SubStr(binary, 1, StrLen(binary) - 18)
else if(SubStr(binary, -11) = "000000000000")
binary := SubStr(binary, 1, StrLen(binary) - 12)
else if(SubStr(binary, -5) = "000000")
binary := SubStr(binary, 1, StrLen(binary) - 6)
; split binary into segements of six
binary := Trim(RegExReplace(binary, "(.{6})", "$1 "))
; convert segments to decimal
base64 := ""
Loop, Parse, binary, %A_Space%
{
base64 .= SubStr(CharSet, ConvertBase(2, 10, A_LoopField) + 1, 1)
}
; If not divisible by 4 add one or two equal signs
if(Mod(StrLen(base64), 4) > 0)
{
; case where input was binary
if(Mod(StrLen(base64), 4) < 2)
base64 .= "A"
base64 .= SubStr("==", 1, (4 - Mod(StrLen(base64), 4)))
}
return base64
}
Base64Decode(Code)
{ ;http://www.autohotkey.com/board/topic/5545-base64-coderdecoder/?p=690930
static CharSet := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Length := StrLen(Code)
;remove padding if present
If SubStr(Code,0) = "="
{
If SubStr(Code,-1,1) = "="
Length -= 2
Else
Length --
}
BufferSize := Ceil((Length / 4) * 3), VarSetCapacity(Data,BufferSize) ;calculate the correct buffer size
Index := 1, BinPos := 0
Loop, % Length >> 2 ;process 4 characters per iteration
{
;decode the characters and store them in the output buffer
Value := ((InStr(CharSet,SubStr(Code,Index,1),1) - 1) << 18)
| ((InStr(CharSet,SubStr(Code,Index + 1,1),1) - 1) << 12)
| ((InStr(CharSet,SubStr(Code,Index + 2,1),1) - 1) << 6)
| (InStr(CharSet,SubStr(Code,Index + 3,1),1) - 1)
Index += 4
Data .= Chr(Value >> 16) . Chr((Value >> 8) & 255) . Chr(Value & 255)
}
Length &= 3 ;determine the number of characters that remain
If Length > 0 ;characters remain
{
;decode the first of the remaining characters and store it in the output buffer
Value := ((InStr(CharSet,SubStr(Code,Index,1),1) - 1) << 18)
| ((InStr(CharSet,SubStr(Code,Index + 1,1),1) - 1) << 12)
Data .= Chr(Value >> 16)
;another character remains
If Length = 3
{
;decode the character and store it in the output buffer
Value |= (InStr(CharSet,SubStr(Code,Index + 2,1),1) - 1) << 6
Data .= Chr((Value >> 8) & 255)
}
}
Return, Data
}
convertInputToText(string, inputEncoding)
{
if(inputEncoding = "BASE64")
decoded := Base64Decode(string)
else if(inputEncoding = "Binary")
decoded := BinToTxt(string)
else if(inputEncoding = "Decimal")
return decimal2Ascii(string)
else if(inputEncoding = "Hexadecimal")
decodeUTF8(decoded, string, "Hexadecimal")
else if(inputEncoding = "ROT13")
return Rot13(string)
else if(inputEncoding = "URI")
return uriDecode(string)
else
return string
return decoded
}
Gui, Add, Text, x12 y10 w30 h20 , Input:
Gui, Add, DropDownList, x52 y10 w310 h20 vinputEncoding Choose1 R9, Text|BASE64|Binary|Decimal|Hexadecimal|ROT13|URI Encoded
Gui, Add, Edit, x12 y40 w360 h60 vconverterInput,
;~ Gui, Add, CheckBox, x402 y10 w90 h30 hwndsmartConvertHwnd vsmartConvert, Smart Encode?
Gui, Add, Button, x392 y50 w150 h40 vencode gencode, Encode
Gui, Add, Text, x12 y120 w110 h20 , Text (ASCII / ANSI)
Gui, Add, Edit, x12 y150 w170 h140 vtextOutput ,
Gui, Add, Button, x12 y300 w80 h30 vcopyToClipboardText gcopyToClipboard, Copy to Clipboard
Gui, Add, Button, x102 y300 w80 h30 vcopyToInputText gcopyToInput, Copy to input
Gui, Add, Text, x202 y120 w110 h20 , Binary
Gui, Add, Edit, x192 y150 w170 h140 vbinaryOutput ,
Gui, Add, Button, x192 y300 w80 h30 vcopyToClipboardBinary gcopyToClipboard, Copy to Clipboard
Gui, Add, Button, x282 y300 w80 h30 vcopyToInputBinary gcopyToInput, Copy to input
Gui, Add, Text, x382 y120 w110 h20 , Decimal
Gui, Add, Edit, x372 y150 w170 h140 vdecimalOutput,
Gui, Add, Button, x372 y300 w80 h30 vcopyToClipboardDecimal gcopyToClipboard, Copy to Clipboard
Gui, Add, Button, x462 y300 w80 h30 vcopyToInputDecimal gcopyToInput, Copy to input
Gui, Add, Text, x12 y350 w110 h20 , BASE64
Gui, Add, Edit, x12 y380 w170 h140 vbase64Output,
Gui, Add, Button, x12 y530 w80 h30 vcopyToClipboardBase64 gcopyToClipboard, Copy to Clipboard
Gui, Add, Button, x102 y530 w80 h30 vcopyToInputBase64 gcopyToInput, Copy to input
Gui, Add, Text, x202 y350 w110 h20 , ROT13
Gui, Add, Edit, x192 y380 w170 h140 vrot13Output,
Gui, Add, Button, x192 y530 w80 h30 vcopyToClipboardRot13 gcopyToClipboard, Copy to Clipboard
Gui, Add, Button, x282 y530 w80 h30 vcopyToInputRot13 gcopyToInput, Copy to input
Gui, Add, Text, x372 y350 w110 h20 , URI Encoded
Gui, Add, Edit, x372 y380 w170 h140 vuriOutput,
Gui, Add, Button, x372 y530 w80 h30 vcopyToClipboardUri gcopyToClipboard, Copy to Clipboard
Gui, Add, Button, x462 y530 w80 h30 vcopyToInputUri gcopyToInput, Copy to input
Gui, Add, Text, x562 y120 w110 h20 , Hexadecimal
Gui, Add, Edit, x562 y150 w170 h140 vhexadecimalOutput,
Gui, Add, Button, x562 y300 w80 h30 vcopyToClipboardHexadecimal gcopyToClipboard, Copy to Clipboard
Gui, Add, Button, x652 y300 w80 h30 vcopyToInputHexadecimal gcopyToInput, Copy to input
Gui, Add, Text, x562 y530 w170 h20 , Made for request on donationcoder
; Generated using SmartGUI Creator 4.0
Gui, Show, xCenter yCenter h566 w746, Encoder
OnMessage(0x200, "Help")
Return
GuiClose:
ExitApp
encode:
Gui, Submit, nohide
GuiControlGet, inputEncoding,, inputEncoding
GuiControlGet, converterInput,, converterInput
;~ GuiControlGet, smartConvertEnabled,, smartConvert
inputList := "Text|BASE64|Binary|Decimal|Hexadecimal|ROT13|URI"
Loop, Parse, inputList, |
{
; clear the output edit field first
Guicontrol,, % A_LoopField . "Output"
Guicontrol,, % A_LoopField . "Output", % convertInputToOutputEncoding(inputEncoding, converterInput, A_LoopField)
}
return
copyToClipboard:
; Use the name of variable name of the button to get the text from the correct edit box
; Each button is named 'copyToClipboardXXXXXX' and each edit is named 'XXXOutput'
GuiControlGet, ClipBoard,, % SubStr(A_GuiControl, 16) . "Output"
return
copyToInput:
; use A_GuiControl to figure out the new input encoding
newInputEncoding := SubStr(A_GuiControl, 12)
; Populate the input encoding
GuiControl, ChooseString, inputEncoding, %newInputEncoding%
; populate input with selected output text found via A_GuiControl
GuiControlGet, output,, % newInputEncoding . "Output"
Guicontrol,, converterInput, %output%
return