ATTENTION: You are viewing a page formatted for mobile devices; to view the full web page, click HERE.

DonationCoder.com Software > Coding Snacks

Encode/decode cipher/decipher crypter/decrypter ASCII HEX Binary Base64 URL etc.

<< < (5/5)

ashecorven:
Hello again,

Thanks for the quick response!

HEX to binary and vice-versa shouldn't have anything to do with ASCII. At the moment, both binary and HEX are being read in as ASCII (converting HEX to * == converting text to *) and (converting binary to * == converting text to *).

Examples.
11111111 00000000 00000000 11111111 should convert to FF00 00FF, but output is 31 31 31 31 31 31 31 31 20 30 30 30 30 30 30 30 30 20 30 30 30 30 30 30 30 30 20 31 31 31 31 31 31 31 31.

E.g. FF00 00FF should convert to 11111111 00000000 00000000 11111111, but output is 01000110 01000110 00110000 00110000 00100000 00110000 00110000 01000110 01000110.

I think a quick way to check if things are being read in correctly would be HEX->HEX, Binary->binary, text->text, etc. At the moment they're not working.

lifeweaver:
Thanks for the input it took me a bit but I think I have everything work, turned out that the base64 was really messed up for numbers it was treating everything as a string.

Spoiler
--- ---#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")
    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)
 
  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
  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)
    base64 .= SubStr("==", 1, (4 - Mod(StrLen(base64), 4)))
 
  return base64
}

convertInputToText(string, inputEncoding)
{
  if(inputEncoding = "BASE64")
    decodeUTF8(decoded, string, "Base64")
  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


lifeweaver:
Look like everything wasn't quite right yet.

Spoiler
--- ---#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


ashecorven:
Lifeweaver, thank you, it's fantastic. Everything seems to be working fantastically.

Really appreciated.

I'm not sure how this is done, but I think this should be added to the list of software available on the site!

Navigation

[0] Message Index

[*] Previous page

Go to full version