Partager via


Base64 Encode/Decode a string

Today I came across https://scripts.readify.net/  . This sight is focused on Monad and MSH and is starting a collection of scripts at: https://scripts.readify.net/Scripts.aspx .  You should visit their site and let them know what type of scripts would be useful to you. 

I particularly liked their entry on how to Base64 encode a file.  This is something that I need occassionally and I can never remember how to do it.  I was about to include it as-is into my profile and decided that there was a better way to do this. 

<IMPORTANT POINT>
Whenever you are adding some functions, you should make a conscious decision about whether those functions are best exposed as a "function" or as a "type extension".
</IMPORTANT POINT>

Both of these mechanisms are great and have their purpose but my observation is that people are not using type-extensions as much as they should.  One of the huge benefits of type extensions is discoverability.  Let me show you how to do this function as a type-extension and highlight the benefits of this approach.

When doing a type extension, you first need to decide what TYPE you are going to extend.  In this case, I decided that I would extend SYSTEM.STRING as that was the most general purpose type for this function.  I then encoded the following in a file called My.Types.Mshxml

</Types>
    <Type>
        <Name>System.String</Name>
        <Members>
            <ScriptProperty>
                <Name>ToBase64String</Name>
                <GetScriptBlock>
                 [System.Convert]::ToBase64String([System.Text.Encoding]::UNICODE.GetBytes($this))
  </GetScriptBlock>
            </ScriptProperty>
            <ScriptProperty>
                <Name>FromBase64String</Name>
                <GetScriptBlock>
                 [System.Text.Encoding]::UNICODE.GetString([System.Convert]::FromBase64String($this))
  </GetScriptBlock>
            </ScriptProperty>
        </Members>
    </Type>
</Types>

 

In my profile I load this file via the command:

   Update-TypeData c:\msh\My.Types.mshxml

Once I do that, these properties are available to any STRING and can be discovered via Get-Member:

MSH> $x="Hello World"
MSH> $x |Get-Member

   TypeName: System.String

Name             MemberType            Definition
----             ----------            ----------
Clone            Method                System.Object Clone()
CompareTo        Method                System.Int32 CompareTo(Object value), System.Int32 CompareTo(String strB)
Contains         Method                System.Boolean Contains(String value)
CopyTo           Method                System.Void CopyTo(Int32 sourceIndex, Char[] destination, Int32 destinationIndex, Int32 count)
EndsWith         Method                System.Boolean EndsWith(String value), System.Boolean EndsWith(String value, StringComparison comparisonType), System.Boolean EndsWith(String value, Boolean ignoreCase, CultureInfo culture)
...

Trim             Method                System.String Trim(Params Char[] trimChars), System.String Trim()
TrimEnd          Method                System.String TrimEnd(Params Char[] trimChars)
TrimStart        Method                System.String TrimStart(Params Char[] trimChars)
Chars            ParameterizedProperty System.Char Chars(Int32 index) {get;}
Length           Property              System.Int32 Length {get;}
FromBase64String ScriptProperty System.Object FromBase64String {get=[System.Text.Encoding]::UNICODE.GetString([System.Convert]::FromBase64String($this));}
ToBase64String ScriptProperty System.Object ToBase64String {get=[System.Convert]::ToBase64String([System.Text.Encoding]::UNICODE.GetBytes($this));}

MSH> $x
Hello World
MSH> $x.ToBase64String
SABlAGwAbABvACAAVwBvAHIAbABkAA==
MSH> $x.ToBase64String.FromBase64String
Hello World
MSH>

 

Enjoy!

Jeffrey Snover
Monad Architect

Comments

  • Anonymous
    March 27, 2006
    I love this.  Today I was reading Mitch Denny's blog (he works for Readify) and saw his post about the new scripts site (http://notgartner.com/posts/4013.aspx) and so I subscribed to it.  I then followed one of the other links from his blog and more links from there, etc eventually finding my way to this site which I also subscribed to.  (I'd seen you on channel9 before but hadn't come accross the blog before today).  And now, the first thing you blog after I subscribe is a link straight back to the blog that started my little MSH journey ealier today.

  • Anonymous
    March 27, 2006
    Great stuff Jeffrey -- it's little posts like these that draw the curtain back enough to let the light in, so to speak. I'd rather 50 of these posts than 50Mb of dry MSDN pages.

    cmd is dead, long live msh!

  • Anonymous
    March 31, 2006
    Thanks for giving us way to extend Monad :)
    Sometimes, when i use get-credential, i usually check for the unsecure, clear string of the credential password, which is of type System.Security.SecureString(refer to Mow's blog http://mow001.blogspot.com/2005/11/get-credential-and-decrypting.html)
    I know that it's not safe to reveal the securestring but I just wanted to extend this script property to SecureString type to view the unsecureString easily without having to specify a function.
    Here is the type I have added.
    <Type>
    <Name>System.Security.SecureString</Name>
    <Members>
    <ScriptProperty>
    <Name>UnsecureString</Name>
    <GetScriptBlock>
    [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($this))
    </GetScriptBlock>
    </ScriptProperty>
    </Members>
    </Type>

    Now I do the following to get the unsecure string
    MSH>$admin = get-credential
    MSH>$admin.password
    System.Security.SecureString
    MSH>$admin.password.unsecurestring
    clear password displayed here

  • Anonymous
    April 26, 2006
    The comment has been removed

  • Anonymous
    April 26, 2006
    The comment has been removed

  • Anonymous
    April 27, 2006
    The comment has been removed

  • Anonymous
    April 27, 2006
    hello! http://www.dirare.com/Sweden/ online directory. SMART Yellow Pages, About DIRare, Search in Business Category. From online directory .

  • Anonymous
    May 31, 2009
    PingBack from http://outdoorceilingfansite.info/story.php?id=23255

  • Anonymous
    May 31, 2009
    PingBack from http://outdoorceilingfansite.info/story.php?id=5619