Beege

Base91 and Base128 Functions

10 posts in this topic

#1 ·  Posted (edited)

Here's  Base91 and Base128 functions I ported from code I found on the net. Quick search of the forum did not pull up anything so don't think these have been posted before. Both just for fun. The base128 is pretty straight forward as its pretty much the same concept as base64 only using 7bits instead of 6, but I thought the base91 was real interesting and Im actually still trying to wrap my head around the algorithm. The functions Ive posted are shortened/combined a bit so if your gonna try and learn the flow I would break it back down to one operation per line. Let me know if you find a string it does not work with. I mainly wanted them for embedding dlls in scripts and the the results are below for a dll that I tested.  Have fun!

 

Base91:

; ; #FUNCTION# ====================================================================================================================
; Name...........: _Base91Encode
; Description ...: Encodes string to Base91
; Author ........: Brian J Christy (Beege)
; Source ........: http://base91.sourceforge.net/  [Joachim Henke]
; ===============================================================================================================================
Func _Base91Encode($sStr)

    Local $aB91 = StringSplit('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"', '', 2)
    Local $sEncoded, $b, $n, $v, $aStr = StringToASCIIArray($sStr)

    For $i = 0 To UBound($aStr) - 1
        $b = BitOR($b, BitShift($aStr[$i], ($n * - 1)))
        $n += 8
        If $n > 13 Then
            $v = BitAND($b, 8191)
            $s = 13 + ($v <= 88)
            If $v <= 88 Then $v = BitAND($b, 16383)
            $b = BitShift($b, $s)
            $n -= $s
            $sEncoded &= $aB91[Mod($v, 91)] & $aB91[$v / 91]
        EndIf
    Next

    If $n Then
        $sEncoded &= $aB91[Mod($b, 91)]
        If $n > 7 Or $b > 90 Then $sEncoded &= $aB91[$b / 91]
    EndIf

    Return $sEncoded

EndFunc   ;==>_Base91Encode

; #FUNCTION# ====================================================================================================================
; Name...........: _Base91Encode
; Description ...: Decodes string from Base91
; Author ........: Brian J Christy (Beege)
; Source ........: http://base91.sourceforge.net/  [Joachim Henke]
; ===============================================================================================================================
Func _Base91Decode($sStr)

    Local $sB91 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"'
    Local $sDecoded, $n, $c, $b, $v = -1, $aStr = StringSplit($sStr, '', 2)

    For $i = 0 To UBound($aStr) - 1
        $c = StringInStr($sB91, $aStr[$i], 1) - 1
        If $v < 0 Then
            $v = $c
        Else
            $v += $c * 91
            $b = BitOR($b, BitShift($v, ($n * - 1)))
            $n += 13 + (BitAND($v, 8191) <= 88)
            Do
                $sDecoded &= Chr(BitAND($b, 255))
                $b = BitShift($b, 8)
                $n -= 8
            Until Not ($n > 7)
            $v = -1
        EndIf
    Next

    If ($v + 1) Then $sDecoded &= Chr(BitAND(BitOR($b, BitShift($v, ($n * - 1))), 255))

    Return $sDecoded

EndFunc   ;==>_Base91Decode
 

Base128:

; #FUNCTION# ====================================================================================================================
; Name...........: _Base128Encode
; Description ...: Decodes string from Base128
; Author ........: Brian J Christy (Beege)
; Source ........: https://github.com/seizu/base128/blob/master/base128.php  [Erich Pribitzer]
; ===============================================================================================================================
Func _Base128Encode($sStr)

    Local $aB128 = StringSplit('!#$%()*,.0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎ', '', 2)
    Local $sEncoded, $ls, $r, $rs = 7, $aStr = StringToASCIIArray($sStr & ' ')

    For $i = 0 To UBound($aStr) - 1
        If $ls > 7 Then
            $i -= 1
            $ls = 0
            $rs = 7
        EndIf
        $nc = BitOR(BitAND(BitShift($aStr[$i], ($ls * -1)), 0x7f), $r)
        $r = BitAND(BitShift($aStr[$i], $rs), 0x7f)
        $rs -= 1
        $ls += 1
        $sEncoded &= $aB128[$nc]
    Next

    Return $sEncoded

EndFunc   ;==>_Base128Encode

; #FUNCTION# ====================================================================================================================
; Name...........: _Base91Encode
; Description ...: Decodes string from Base128
; Author ........: Brian J Christy (Beege)
; Source ........: https://github.com/seizu/base128/blob/master/base128.php  [Erich Pribitzer]
; ===============================================================================================================================
Func _Base128Decode($sStr)

    Local $sB128 = '!#$%()*,.0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎ'
    Local $sDecoded, $r, $rs = 8, $ls = 7, $aStr = StringSplit($sStr, '', 2)

    For $i = 0 To UBound($aStr) - 1
        $nc = StringInStr($sB128, $aStr[$i], 1) - 1
        If $rs > 7 Then
            $rs = 1
            $ls = 7
            $r = $nc
            ContinueLoop
        EndIf
        $r1 = $nc
        $nc = BitOR(BitAND(BitShift($nc, ($ls * -1)), 0xFF), $r)
        $r = BitShift($r1, $rs)
        $rs += 1
        $ls -= 1
        $sDecoded &= Chr($nc)
    Next

    Return $sDecoded

EndFunc   ;==>_Base128Decode
Dll Size Tests:

Binary Len  =   57346
Base64 Len  =   38232
Base91 Len  =   35180
Base128 Len =   32768
Base91 - Base128.au3

Edit: Fixed Base91 error pointed out by trancexx

Edited by Beege

Share this post


Link to post
Share on other sites



Base91 is really interesting.

Unfortunatly something like this doesn't work:

$sStr = FileRead(@ScriptFullPath)

ConsoleWrite(_Base91Decode(_Base91Encode($sStr)) & @CRLF)



; #FUNCTION# ====================================================================================================================
; Name...........: _Base91Encode
; Description ...: Encodes string to Base91
; Author ........: Brian J Christy (Beege)
; Source ........: http://base91.sourceforge.net/  [Joachim Henke]
; ===============================================================================================================================
Func _Base91Encode($sStr)

    Local $aB91 = StringSplit('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"', '', 2)
    Local $sEncoded, $b, $n, $v, $s, $aStr = StringToASCIIArray($sStr)

    For $i = 0 To UBound($aStr) - 1
        $b = BitOR($b, BitShift($aStr[$i], ($n * -1)))
        $n += 8
        If $n > 13 Then
            $v = BitAND($b, 8191)
            If ($v <= 88) Then $v = BitAND($b, 16383)
            $s = 13 + ($v <= 88)
            $b = BitShift($b, $s)
            $n -= $s
            $sEncoded &= $aB91[Mod($v, 91)] & $aB91[$v / 91]
        EndIf
    Next

    If $n Then
        $sEncoded &= $aB91[Mod($b, 91)]
        If $n > 7 Or $b > 90 Then $sEncoded &= $aB91[$b / 91]
    EndIf

    Return $sEncoded

EndFunc   ;==>_Base91Encode

; #FUNCTION# ====================================================================================================================
; Name...........: _Base91Encode
; Description ...: Decodes string from Base91
; Author ........: Brian J Christy (Beege)
; Source ........: http://base91.sourceforge.net/  [Joachim Henke]
; ===============================================================================================================================
Func _Base91Decode($sStr)

    Local $sB91 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&()*+,./:;<=>?@[]^_`{|}~"'
    Local $sDecoded, $n, $c, $b, $v = -1, $aStr = StringSplit($sStr, '', 2)

    For $i = 0 To UBound($aStr) - 1
        $c = StringInStr($sB91, $aStr[$i], 1) - 1
        If $v < 0 Then
            $v = $c
        Else
            $v += $c * 91
            $b = BitOR($b, BitShift($v, ($n * -1)))
            $n += 13 + (BitAND($v, 8191) <= 88)
            Do
                $sDecoded &= Chr(BitAND($b, 255))
                $b = BitShift($b, 8)
                $n -= 8
            Until Not ($n > 7)
            $v = -1
        EndIf
    Next

    If ($v + 1) Then $sDecoded &= Chr(BitAND(BitOR($b, BitShift($v, ($n * -1))), 255))

    Return $sDecoded

EndFunc   ;==>_Base91Decode

Did you just translate the code from another language or made it by following documentation.


♡♡♡

.

eMyvnE

Share this post


Link to post
Share on other sites

Hey good catch. Thanks! Ill be looking at this later to see if I can pinpoint the problem. - If its my code or not. 

Just a translation from other code  :evil:. Surprisingly base91 really didn't have any documentation that I could find other than what the code does. 

Share this post


Link to post
Share on other sites

Fixed error pointed out by trancexx. thanks again

Share this post


Link to post
Share on other sites

#5 ·  Posted (edited)

_Example()

Func _Example()

        Local $sTest = "bad49c8aa9505e47ee6176feb1ec1aa9"

        $sEnc = _Base128Encode($sTest)
        $sDec = _Base128Decode($sEnc)
        If $sDec = $sTest Then
                ConsoleWrite($sEnc & @LF & $sDec & @LF & '**Test Passed**' & @LF)
        Else
                ConsoleWrite($sEnc & @LF & $sDec & @LF & '**Test Failed**' & @LF)
        EndIf

EndFunc   ;==>_Example

; #FUNCTION# ====================================================================================================================
; Name...........: _Base128Encode
; Description ...: Decodes string from Base128
; Author ........: Brian J Christy (Beege)
; Source ........: https://github.com/seizu/base128/blob/master/base128.php  [Erich Pribitzer]
; ===============================================================================================================================
Func _Base128Encode($sStr)

    Local $aB128 = StringSplit('!#$%()*,.0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~?¢£¤¥|§¨?a???ˉ°±23′μ?·?1o?????àá??????èéê?ìí?', '', 2)
    Local $sEncoded, $ls, $r, $rs = 7, $aStr = StringToASCIIArray($sStr & ' ')

    For $i = 0 To UBound($aStr) - 1
        If $ls > 7 Then
            $i -= 1
            $ls = 0
            $rs = 7
        EndIf
        $nc = BitOR(BitAND(BitShift($aStr[$i], ($ls * - 1)), 0x7f), $r)
        $r = BitAND(BitShift($aStr[$i], $rs), 0x7f)
        $rs -= 1
        $ls += 1
        $sEncoded &= $aB128[$nc]
    Next

    Return $sEncoded

EndFunc   ;==>_Base128Encode

; #FUNCTION# ====================================================================================================================
; Name...........: _Base91Encode
; Description ...: Decodes string from Base128
; Author ........: Brian J Christy (Beege)
; Source ........: https://github.com/seizu/base128/blob/master/base128.php  [Erich Pribitzer]
; ===============================================================================================================================
Func _Base128Decode($sStr)

    Local $sB128 = '!#$%()*,.0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~?¢£¤¥|§¨?a???ˉ°±23′μ?·?1o?????àá??????èéê?ìí?'
    Local $sDecoded, $r, $rs = 8, $ls = 7, $aStr = StringSplit($sStr, '', 2)

    For $i = 0 To UBound($aStr) - 1
        $nc = StringInStr($sB128, $aStr[$i], 1) - 1
        If $rs > 7 Then
            $rs = 1
            $ls = 7
            $r = $nc
            ContinueLoop
        EndIf
        $r1 = $nc
        $nc = BitOR(BitAND(BitShift($nc, ($ls * - 1)), 0xFF), $r)
        $r = BitShift($r1, $rs)
        $rs += 1
        $ls -= 1
        $sDecoded &= Chr($nc)
    Next

    Return $sDecoded

EndFunc   ;==>_Base128Decode

±n8M:?BF°n′S%Py]_?;UμPxEbx=:@P§[[n)w%

bad4?b8aa9505e?)ee6176feb1ec1aa9 **Test Failed**

Base128  The result of the decryption and encryption string is not the same as before

Edited by xz00311
±n8M:?BF°n′S%Py]_?;UμPxEbx=:@P§[[n)w% bad4?b8aa9505e?)ee6176feb1ec1aa9 **Test Failed**

Share this post


Link to post
Share on other sites

±n8M:?BF°n′S%Py]_?;UμPxEbx=:@P§[[n)w%

bad4?b8aa9505e?)ee6176feb1ec1aa9 **Test Failed**

See my previous posting source, long string encryption, decryption and encryption string before is not the same

Share this post


Link to post
Share on other sites
On 2/22/2016 at 11:05 PM, xz00311 said:
Func _Base128Encode($sStr)

    Local $aB128 = StringSplit('!#$%()*,.0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~?¢£¤¥|§¨?a???ˉ°±23′μ?·?1o?????àá??????èéê?ìí?', '', 2)

EndFunc   ;==>_Base128Encode


Func _Base128Decode($sStr)

    Local $sB128 = '!#$%()*,.0123456789:;=@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~?¢£¤¥|§¨?a???ˉ°±23′μ?·?1o?????àá??????èéê?ìí?'

EndFunc   ;==>_Base128Decode

±n8M:?BF°n′S%Py]_?;UμPxEbx=:@P§[[n)w%

bad4?b8aa9505e?)ee6176feb1ec1aa9 **Test Failed**

Base128  The result of the decryption and encryption string is not the same as before

If that's the actual code being used then something went wrong with your copy and paste i think. The character set for $aB128 doesn't match what was originally posted. Make sure you download the .au3 file posted when doing your tests.

±n8M:¶BF°n´S%Py]_½;UµPxEbx=:@P§[[n)w%
bad49c8aa9505e47ee6176feb1ec1aa9
**Test Passed**
1 person likes this

Share this post


Link to post
Share on other sites

Signature beginning:   Wondering who uses AutoIT and what it can be used for ?
* GHAPI UDF - modest begining - comunication with GitHub REST API *
ADO.au3 UDF     POP3.au3 UDF     XML.au3 UDF    How to use IE.au3  UDF with  AutoIt v3.3.14.x  for other useful stuff click the following button

Spoiler

Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. 

My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST API *

My contribution to others projects or UDF based on  others projects: * _sql.au3 UDF  * POP3.au3 UDF *  RTF Printer - UDF * XML.au3 - BETA * ADO.au3 UDF SMTP Mailer UDF *

Useful links: * Forum Rules * Forum etiquette *  Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * 

Wiki: Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Best coding practices * 

IE Related:  * How to use IE.au3  UDF with  AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * 

I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions *  EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *

"Homo sum; humani nil a me alienum puto" - Publius Terentius Afer
"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming"
:naughty:  :ranting:, be  :) and       \\//_.

Anticipating Errors :  "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty."

Signature last update: 2017-06-04

Share this post


Link to post
Share on other sites

thank you

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Similar Content

    • RobOtter
      By RobOtter
      Hi,
      is there a function or a UDF for parsing a hotkey definition string like "^a" or "+!{F1}" ?
      I´d like to create a settings GUI where users are able to define their custom hotkeys for a specific function and then save it to an ini. Of course, at the next start of the program, these settings have to read and not only the HotkeySet() command needs to be fed with it but also the settings GUI.
      As I do not want to present the user just the hotkey string but a rather user-friendly display (like checkboxes for the separate modifier keys and a drop down list of supported trigger keys), I need to fiddle on the saved string.
      I would envision a function that takes a hotkey string and returns for example an array like this: [isCtrl][isAlt][isShift][isWin][triggerKey][isTriggerVirtual]. And of course, there needs to be a function decoding the array back to the respective string representation.
       
      Thanks for your hints!
    • noorm
      By noorm
      Hello!
      I've been lurking around for a loooong time... and I decided to finally share a little. I do a lot of internet stuff, mostly machine to machine for work (instrumentation) so I have quite a few "RFC" scripts.
      Disclaimer these work for me... but I sometime use... "shortcuts" based on my particular requirement. An example, the Base64 encoding snippet might not be too good for binary data. I pad the original data with spaces to avoid the "==" padding of base64.
      So... first is the base64 encoding snippet. It is not in a function, it was in a sequential program, used only once! It encode $Graph to $SMTPMessage:
      ; Create the base64 encoding table Dim $Base64EncodingTable[0] For $Cpt = Asc("A") to Asc("Z") _ArrayAdd($Base64EncodingTable, Chr($Cpt)) Next For $Cpt = Asc("a") to Asc("z") _ArrayAdd($Base64EncodingTable, Chr($Cpt)) Next For $Cpt = Asc("0") to Asc("9") _ArrayAdd($Base64EncodingTable, Chr($Cpt)) Next _ArrayAdd($Base64EncodingTable, "+") _ArrayAdd($Base64EncodingTable, "/") ; Pad the SVG Graph to attach with space(s). Lazy way to avoid base64 == pading While Mod(StringLen($Graph), 3) <> 0 $Graph &= " " WEnd ; Start from the first character $Cpt = 1 Do ; Extract the 3 characters to encode $Char1 = Asc(StringMid($Graph, $Cpt, 1)) $Char2 = Asc(StringMid($Graph, $Cpt+1, 1)) $Char3 = Asc(StringMid($Graph, $Cpt+2, 1)) ; Encode them to 4 characters $SMTPMessage &= $Base64EncodingTable[BitShift(BitAND($Char1, 252), 2)] $SMTPMessage &= $Base64EncodingTable[BitShift(BitAND($Char1, 3), -4) + BitShift(BitAND($Char2, 240), 4)] $SMTPMessage &= $Base64EncodingTable[BitShift(BitAND($Char2, 15), -2) + BitShift(BitAND($Char3, 192), 6)] $SMTPMessage &= $Base64EncodingTable[BitAND($Char3, 63)] ; Increment the counter, and if required, add a @CRLF to split in multiples lines $Cpt += 3 If Mod($Cpt, 57) = 1 Then $SMTPMessage &= @CRLF ; Do this until all the graph has been encoded Until $Cpt >= StringLen($Graph)  
      Second... I just finished this one and was allready thinking about sharing it... so it's been encapsulated into function a bit more. I use it to decode email subjects in a system where you can update something by email. I separated the Base64Decode function so it can be grabbed more easily. Please note that it return an hex string so you would still need to convert it if it's a string with BinaryToString or whatever suit your needs.
      If can be copied as is and runned directly... it include my test strings! (Yes... I'm french!)
      ; For the $SB_UTF8 and $SB_ANSI Variable #include <StringConstants.au3> ; For _ArrayAdd and _ArraySearch used in the Base64 decoder #include <Array.au3> ; Various test sentences... ;$text = "=?UTF-8?Q?Ce=c3=a7i_est_un_autre_test!_h=c3=a9h=c3=a9!?=" ; Normal UTF-8 ;$text = "=?UTF-8?Q?Encore_=3d_un_autre_test_=c3=a9_?=" ; "=" added ;$text = "=?UTF-8?Q?un_autre_test_=5f_=c3=a9?=" ; "_" added ;$text = "=?UTF-8?B?Q2XDp2kgZXN0IHVuIGF1dHJlIHRlc3QhID0gXyBow6low6kh?=" ; UTF-8 Base64 $text = "=?UTF-8?B?ZcOnaSBlc3QgdW4gYXV0cmUgdGVzdCEgPSBfIGjDqWjDqSE=?=" ; UTF-8 Base64 with padding ;$text = "=?iso-8859-1?Q?Ce=E7i_est_un_test!?=" ; iso-8859-1 MsgBox(0, "", DecodeHeader($text)) Func DecodeHeader($lString) ; Check and store encoding type If StringInStr($lString, "?Q?") Then ; Quoted printable content $lType = "?Q?" ElseIf StringInStr($lString, "?B?") Then ; Base64 encoding $lType = "?B?" Else ; No encoding (or unknown encoding) return($lString) EndIf ; Start of the charset string $lStart = StringInStr($lString, "=?") + 2 ; End of the charset string $lStop = StringInStr($lString, $lType) ; Charset variable, storing "UTF-8" or "iso-8859-1" $lEncoding = StringMid($lString, $lStart, $lStop-$lStart) ; Change encoding type for the BinaryToString flag If $lEncoding = "UTF-8" Then $lEncoding = $SB_UTF8 ElseIf $lEncoding = "iso-8859-1" Then $lEncoding = $SB_ANSI Else MsgBox(0, "", "Unknown character set") Exit EndIf ; Start of the actual encoded content $lStart = $lStop + 3 ; End of the actual encoded content $lStop = StringInStr($lString, "?=") ; Actual content to decode $lString = StringMid($lString, $lStart, $lStop-$lStart) ; For Quoted printable content If $lType == "?Q?" Then ; Restore underscore encoded spaces $lString = StringReplace($lString, "_", " ") ; Starting with the first character of the string $lCpt = 1 ; "=XX" search and convert loop While 1 ; There will be 0 characters to convert in that block unless... $lConvertableLenght = 0 ; That character, and another one 3 bytes over... and the next, and the next... For $lCpt2 = 0 to 100 ; Is equal to "=" If StringMid($lString, $lCpt+($lCpt2*3), 1) == "=" Then ; In that case, yes, we will have to convert 3 more characters $lConvertableLenght += 3 Else ; But if we fail to find or reach the end of a block of encoded characters, exit the search ExitLoop EndIf Next ; If we did in fact find some encoded characters If $lConvertableLenght > 0 Then ; Extract that block of encoded characters $lConvertableString = StringMid($lString, $lCpt, $lConvertableLenght) ; Convert it $lConvertedString = BinaryToString("0x" & StringReplace($lConvertableString, "=", ""), $lEncoding) ; Replace it in the original $lString = StringReplace($lString, $lConvertableString, $lConvertedString) EndIf ; Increment the "=XX" search and convert loop counter $lCpt += 1 ; If we reached the end of the string, exit the "=XX" search and convert loop If $lCpt >= StringLen($lString) Then ExitLoop ; Continue searching in the "=XX" search and convert loop WEnd ; For Base64 encoded strings Else ; Use the separate Base64Decode function $lString = Base64Decode($lString) $lString = BinaryToString($lString, $lEncoding) EndIf return($lString) EndFunc Func Base64Decode($lEncoded) ; Create the base64 encoding table Dim $Base64EncodingTable[0] For $Cpt = Asc("A") to Asc("Z") _ArrayAdd($Base64EncodingTable, Chr($Cpt)) Next For $Cpt = Asc("a") to Asc("z") _ArrayAdd($Base64EncodingTable, Chr($Cpt)) Next For $Cpt = Asc("0") to Asc("9") _ArrayAdd($Base64EncodingTable, Chr($Cpt)) Next _ArrayAdd($Base64EncodingTable, "+") _ArrayAdd($Base64EncodingTable, "/") ; Start from the first character $Cpt = 1 $Decoded = "0x" Do ; Extract the 4 characters to encode $Char1 = StringMid($lEncoded, $Cpt, 1) $Char2 = StringMid($lEncoded, $Cpt+1, 1) $Char3 = StringMid($lEncoded, $Cpt+2, 1) $Char4 = StringMid($lEncoded, $Cpt+3, 1) ; Decode them $Decoded &= Hex(BitShift(_ArraySearch($Base64EncodingTable, $Char1, 0, 0, 1), -2) + BitShift(BitAnd(_ArraySearch($Base64EncodingTable, $Char2, 0, 0, 1), 48), 4), 2) If $Char3 <> "=" Then $Decoded &= Hex(BitShift(BitAnd(_ArraySearch($Base64EncodingTable, $Char2, 0, 0, 1), 15), -4) + BitShift(BitAnd(_ArraySearch($Base64EncodingTable, $Char3, 0, 0, 1), 60), 2), 2) If $Char4 <> "=" Then $Decoded &= Hex(BitShift(BitAnd(_ArraySearch($Base64EncodingTable, $Char3, 0, 0, 1), 3), -6) + _ArraySearch($Base64EncodingTable, $Char4, 0, 0, 1), 2) ; Increment the counter $Cpt += 4 ; Do this until all the encoded string has been decoded Until $Cpt >= StringLen($lEncoded) return($Decoded) EndFunc  
      Last thing... I may update it into a better format for you, like a standalone telnet program with GUI. It is my telnet options negociations loops. The basic concept is systematically deny all request for special options and keep it "raw".
      If server says "Will", I reply "Don't". If it says "Do", I reply "Wont"... unless it's the terminal type subnegociation, in which case I reply xterm!
      $Data for now needs to be Global. You still need to know what you're doing, opening sockets and making a basic communication loop or something.
      Global $T_Is = Chr(0) Global $T_Send = Chr(1) Global $T_TerminalType = Chr(24) Global $T_SE = Chr(240) Global $T_SB = Chr(250) Global $T_Will = Chr(251) Global $T_Wont = Chr(252) Global $T_Do = Chr(253) Global $T_Dont = Chr(254) Global $T_IAC = Chr(255) Func NegotiateTelnetOptions() $NegotiationCommandsToSendBack = "" While StringInStr($Data, $T_IAC) $IACPosition = StringInStr($Data, $T_IAC) Switch StringMid($Data, $IACPosition+1, 1) Case $T_Will $NegotiationCommandsToSendBack &= CraftReply_CleanUpData($IACPosition, $T_Dont) Case $T_Do If StringMid($Data, $IACPosition+2, 1) = $T_TerminalType Then $NegotiationCommandsToSendBack &= CraftReply_CleanUpData($IACPosition, $T_Will) Else $NegotiationCommandsToSendBack &= CraftReply_CleanUpData($IACPosition, $T_Wont) EndIf Case $T_SB If StringMid($Data, $IACPosition, 6) = ($T_IAC & $T_SB & $T_TerminalType & $T_Send & $T_IAC & $T_SE) Then $NegotiationCommandsToSendBack &= $T_IAC & $T_SB & $T_TerminalType & $T_Is & "xterm" & $T_IAC & $T_SE $Data = StringReplace($Data, StringMid($Data, $IACPosition, 6), "") Else MsgBox(0, "", "Unknown Subnegotiation...") ; Should never happen. Exit EndIf EndSwitch WEnd Return $NegotiationCommandsToSendBack EndFunc Func CraftReply_CleanUpData($IACPosition, $Reply) $PartialCommandToSendBack = $T_IAC & $Reply & StringMid($Data, $IACPosition+2, 1) $Data = StringReplace($Data, StringMid($Data, $IACPosition, 3), "") Return $PartialCommandToSendBack EndFunc  
    • Adams
      By Adams
      With Autoit 3.3.12.0 a script like the one attached was reading the file "sync_config.db" of google drive, located at %LOCALAPPDATA%\Google\Drive returning into var $sCloudFolder the value "C:\Users\Adams\Google Drive".
      Now, with Autoit 3.3.14.1, the same script, reading the same file, return into var a long string of characters.
      I made a text version of the file using copy and paste to observe the correct behavior.
      I think that the cause is the new method of decoding, but I could not figure out how to solve.
      #include-once #include <FileConstants.au3> #include <Constants.au3> ; if the Google Drive configuration file exists, it is read If FileExists("sync_config.db") Then ; open the Google Drive configuration file in reading $Handle_GoogleDrive_R = FileOpen("sync_config.db", $FO_READ) If $Handle_GoogleDrive_R = -1 Then ; Check if file opened for reading OK MsgBox(0, "Error", "An error occurred when reading the file " & "sync_config.db") Exit EndIf ; reading Google Drive configuration file $File_GoogleDrive = FileRead($Handle_GoogleDrive_R) ConsoleWrite("$File_GoogleDrive = " & $File_GoogleDrive & @CR) ; find folder path initial position $Start = 1 $Find = "local_sync_root_pathvalue\\?\" $Result = StringInStr($File_GoogleDrive, $Find, 0, 1, $Start) ; find folder path final position $Start = $Result + 29 $Find = "" $Result = StringInStr($File_GoogleDrive, $Find, 0, 1, $Start) $Len = $Result - $Start ; folder for Google Drive Service $sCloudFolder = StringMid($File_GoogleDrive, $Start, $Len) ConsoleWrite("$sCloudFolder = " & $sCloudFolder & @CR) ; close Google Drive configuration file FileClose($Handle_GoogleDrive_R) EndIf  
      sync_config_original.db
      sync_config_copy.db