Hashtable Lookup











up vote
0
down vote

favorite
1












The code below creates a hash table containing a reversed cipher. I am trying to preform a lookup on the hash table, and return the results. I am trying to decrypt the content inside of an XML file provided to me, with the script i've created below in powershell.



$translation = [ordered]@{}
$alpha = 'A'..'Z'
For($i=0; $i -lt 26; $i++)
{
$translation[$alpha[((((-$i + $offset) % 26) + 26) % 26)]] = $alpha[$i]
}


The XML file contains:



<?xml version="1.0" encoding="UTF-8"?>
<translate>
<caesar_cipher>
<offset>-7</offset>
<cipher>
RFGNCTAZITALFGB FG BZRRPBBOZIIV RFHEIPALGN AMP TQYTGRPQ EFXPCBMPII
TBBLNGHPGA
</cipher>
</caesar_cipher>
</translate>


Any idea how to preform a lookup in the hash table to decrypt the message within the XML file, outputting to powershell?










share|improve this question
























  • Duplicate of the question here
    – TheIncorrigible1
    Nov 21 at 21:47






  • 4




    Please don't make more work for people by vandalizing your posts. By posting on the Stack Exchange (SE) network, you've granted a non-revocable right, under the CC BY-SA 3.0 license, for SE to distribute that content (i.e. regardless of your future choices). By SE policy, the non-vandalized version of the post is the one which is distributed. Thus, any vandalism will be reverted.
    – K.Dᴀᴠɪs
    Nov 21 at 22:17















up vote
0
down vote

favorite
1












The code below creates a hash table containing a reversed cipher. I am trying to preform a lookup on the hash table, and return the results. I am trying to decrypt the content inside of an XML file provided to me, with the script i've created below in powershell.



$translation = [ordered]@{}
$alpha = 'A'..'Z'
For($i=0; $i -lt 26; $i++)
{
$translation[$alpha[((((-$i + $offset) % 26) + 26) % 26)]] = $alpha[$i]
}


The XML file contains:



<?xml version="1.0" encoding="UTF-8"?>
<translate>
<caesar_cipher>
<offset>-7</offset>
<cipher>
RFGNCTAZITALFGB FG BZRRPBBOZIIV RFHEIPALGN AMP TQYTGRPQ EFXPCBMPII
TBBLNGHPGA
</cipher>
</caesar_cipher>
</translate>


Any idea how to preform a lookup in the hash table to decrypt the message within the XML file, outputting to powershell?










share|improve this question
























  • Duplicate of the question here
    – TheIncorrigible1
    Nov 21 at 21:47






  • 4




    Please don't make more work for people by vandalizing your posts. By posting on the Stack Exchange (SE) network, you've granted a non-revocable right, under the CC BY-SA 3.0 license, for SE to distribute that content (i.e. regardless of your future choices). By SE policy, the non-vandalized version of the post is the one which is distributed. Thus, any vandalism will be reverted.
    – K.Dᴀᴠɪs
    Nov 21 at 22:17













up vote
0
down vote

favorite
1









up vote
0
down vote

favorite
1






1





The code below creates a hash table containing a reversed cipher. I am trying to preform a lookup on the hash table, and return the results. I am trying to decrypt the content inside of an XML file provided to me, with the script i've created below in powershell.



$translation = [ordered]@{}
$alpha = 'A'..'Z'
For($i=0; $i -lt 26; $i++)
{
$translation[$alpha[((((-$i + $offset) % 26) + 26) % 26)]] = $alpha[$i]
}


The XML file contains:



<?xml version="1.0" encoding="UTF-8"?>
<translate>
<caesar_cipher>
<offset>-7</offset>
<cipher>
RFGNCTAZITALFGB FG BZRRPBBOZIIV RFHEIPALGN AMP TQYTGRPQ EFXPCBMPII
TBBLNGHPGA
</cipher>
</caesar_cipher>
</translate>


Any idea how to preform a lookup in the hash table to decrypt the message within the XML file, outputting to powershell?










share|improve this question















The code below creates a hash table containing a reversed cipher. I am trying to preform a lookup on the hash table, and return the results. I am trying to decrypt the content inside of an XML file provided to me, with the script i've created below in powershell.



$translation = [ordered]@{}
$alpha = 'A'..'Z'
For($i=0; $i -lt 26; $i++)
{
$translation[$alpha[((((-$i + $offset) % 26) + 26) % 26)]] = $alpha[$i]
}


The XML file contains:



<?xml version="1.0" encoding="UTF-8"?>
<translate>
<caesar_cipher>
<offset>-7</offset>
<cipher>
RFGNCTAZITALFGB FG BZRRPBBOZIIV RFHEIPALGN AMP TQYTGRPQ EFXPCBMPII
TBBLNGHPGA
</cipher>
</caesar_cipher>
</translate>


Any idea how to preform a lookup in the hash table to decrypt the message within the XML file, outputting to powershell?







powershell hashtable caesar-cipher






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 21 at 22:35









mklement0

122k20234264




122k20234264










asked Nov 21 at 20:53









bear443

83




83












  • Duplicate of the question here
    – TheIncorrigible1
    Nov 21 at 21:47






  • 4




    Please don't make more work for people by vandalizing your posts. By posting on the Stack Exchange (SE) network, you've granted a non-revocable right, under the CC BY-SA 3.0 license, for SE to distribute that content (i.e. regardless of your future choices). By SE policy, the non-vandalized version of the post is the one which is distributed. Thus, any vandalism will be reverted.
    – K.Dᴀᴠɪs
    Nov 21 at 22:17


















  • Duplicate of the question here
    – TheIncorrigible1
    Nov 21 at 21:47






  • 4




    Please don't make more work for people by vandalizing your posts. By posting on the Stack Exchange (SE) network, you've granted a non-revocable right, under the CC BY-SA 3.0 license, for SE to distribute that content (i.e. regardless of your future choices). By SE policy, the non-vandalized version of the post is the one which is distributed. Thus, any vandalism will be reverted.
    – K.Dᴀᴠɪs
    Nov 21 at 22:17
















Duplicate of the question here
– TheIncorrigible1
Nov 21 at 21:47




Duplicate of the question here
– TheIncorrigible1
Nov 21 at 21:47




4




4




Please don't make more work for people by vandalizing your posts. By posting on the Stack Exchange (SE) network, you've granted a non-revocable right, under the CC BY-SA 3.0 license, for SE to distribute that content (i.e. regardless of your future choices). By SE policy, the non-vandalized version of the post is the one which is distributed. Thus, any vandalism will be reverted.
– K.Dᴀᴠɪs
Nov 21 at 22:17




Please don't make more work for people by vandalizing your posts. By posting on the Stack Exchange (SE) network, you've granted a non-revocable right, under the CC BY-SA 3.0 license, for SE to distribute that content (i.e. regardless of your future choices). By SE policy, the non-vandalized version of the post is the one which is distributed. Thus, any vandalism will be reverted.
– K.Dᴀᴠɪs
Nov 21 at 22:17












3 Answers
3






active

oldest

votes

















up vote
3
down vote



accepted










# The input XML.
$xml = @'
<?xml version="1.0" encoding="UTF-8"?>
<translate>
<caesar_cipher>
<offset>-7</offset>
<cipher>
RFGNCTAZITALFGB FG BZRRPBBOZIIV RFHEIPALGN AMP TQYTGRPQ EFXPCBMPII
TBBLNGHPGA
</cipher>
</caesar_cipher>
</translate>
'@

# Read the XML text into an XML DOM (XmlDocument).
$doc = [xml] $xml

# Extract the offset needed to build the translation hashtable.
$offset = $doc.translate.caesar_cipher.offset

# Build the translation hashtable, which maps a given [char] instance
# to a different [char] instance.
# (The hashtable doesn't strictly need to be *ordered*.)
$translation = [ordered] @{}
# NOTE: 'A'..'Z' only works in PowerShell *Core*.
# In *Windows PowerShell* you must use construct the array via *code points*,
# as shown in the next statement.
$alpha = [char] (65..90)
for($i=0; $i -lt 26; $i++) {
$translation[$alpha[((((-$i + $offset) % 26) + 26) % 26)]] = $alpha[$i]
}
# Add an entry to pass spaces through as-is.
$translation[[char] ' '] = [char] ' '

# Extract the text to be deciphered.
$cipherText = $doc.translate.caesar_cipher.cipher

# Translate the individual characters and reassemble them into a string.
-join $translation[[char] $cipherText]


The above yields:



CONGRATULATIONS ON SUCCESSFULLY COMPLETING THE ADVANCED POWERSHELL ASSIGNMENT    


And congratulations on successfully making us do your homework for you.





Note:





  • PowerShell automatically provides convenient dot notation (.) to drill down into XML documents.




    • For background information and caveats, see this answer.

    • If you need sophisticated queries agains the XML DOM, use the Select-Xml cmdlet, which is XPath-based.



  • Pitfall: PowerShell often automatically treats [char] instances as [string] instances as needed, but not in the case of hashtable lookups: hashtable lookups must use the same data type as the key's data type, which is why $cipherText is cast to [char] to look up [char] instances and why adding the entry for spaces above uses an explicit [char] cast to define the key.


  • Windows PowerShell only supports numerical endpoints for .., the range operator, whereas PowerShell Core also supports characters.







share|improve this answer



















  • 1




    Nice, didn't realize you could [char]$string
    – TheIncorrigible1
    Nov 21 at 21:48










  • @bear443: Sounds like you're using Windows PowerShell, not PowerShell Core. Only the latter supports using characters with .. to create ranges of characters. See my update for how to do it in Windows PowerShell. The updated code should now run on Windows PowerShell and PowerShell Core alike.
    – mklement0
    Nov 21 at 22:04










  • @TheIncorrigible1: Yes, it's effectively the same as $string.ToCharArray(), but I prefer [char], because it is more PowerShell-idiomatic. Performance-wise, there's virtually no difference.
    – mklement0
    Nov 21 at 22:52


















up vote
1
down vote













You have a couple issues with your script. First, your generation of the cipher's math is wrong. You want to pull the offset from the xml. You also want to catch the space character in your hash or it'll return $null when the lookup is performed. This is true of any other non-alpha characters unless you have them defined. Once this is addressed, all you need to do is perform the lookup and join the characters back together. You can perform multiple lookups in a dictionary by passing an array in PowerShell exemplified below.



# initialize alpha and hash lookups
$alpha = 'A'..'Z'
$decipher = @{ ' ' = ' ' }

# load prerequisite variables
$xml = [xml]@'
<?xml version="1.0" encoding="UTF-8"?>
<translate>
<caesar_cipher>
<offset>-7</offset>
<cipher>
RFGNCTAZITALFGB FG BZRRPBBOZIIV RFHEIPALGN AMP TQYTGRPQ EFXPCBMPII TBBLNGHPGA
</cipher>
</caesar_cipher>
</translate>
'@
$offset = [int]$xml.translate.caesar_cipher.offset
$cipher = $xml.translate.caesar_cipher.cipher

# generate decipher table
0..($alpha.Length - 1) | % {$decipher["$($alpha[(-$_ + $offset) % $alpha.Length])"] = $alpha[$_]}

# perform lookups
-join $decipher[$cipher -split '']





share|improve this answer























  • I am getting this null error frequently. Is there a way to use this in a script like mklement0 commented?
    – bear443
    Nov 21 at 21:44










  • @bear443 I used this without any error. Sounds like user-error.
    – TheIncorrigible1
    Nov 21 at 21:46


















up vote
0
down vote













As TheIncorrigible1 suggests, you can use the XPath expression //cipher/text() to select the desired text nodes.



$xml = [xml](Get-Content pathtofile.xml)

$Ciphers = $xml.SelectNodes('//cipher/text()').InnerText
foreach($Cipher in $Ciphers){
Write-Host "Cipher text:`n$Cipher" -ForegroundColor Magenta
Write-Host "Decrypted text:`n$(-join ($Cipher.ToCharArray() |ForEach-Object {
# if it's in the set A..Z, translate
if($_ -in $alpha){
$_ = $translation[$_]
}
$_
}))" -ForegroundColor Green
}





share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














     

    draft saved


    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53420312%2fhashtable-lookup%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    3
    down vote



    accepted










    # The input XML.
    $xml = @'
    <?xml version="1.0" encoding="UTF-8"?>
    <translate>
    <caesar_cipher>
    <offset>-7</offset>
    <cipher>
    RFGNCTAZITALFGB FG BZRRPBBOZIIV RFHEIPALGN AMP TQYTGRPQ EFXPCBMPII
    TBBLNGHPGA
    </cipher>
    </caesar_cipher>
    </translate>
    '@

    # Read the XML text into an XML DOM (XmlDocument).
    $doc = [xml] $xml

    # Extract the offset needed to build the translation hashtable.
    $offset = $doc.translate.caesar_cipher.offset

    # Build the translation hashtable, which maps a given [char] instance
    # to a different [char] instance.
    # (The hashtable doesn't strictly need to be *ordered*.)
    $translation = [ordered] @{}
    # NOTE: 'A'..'Z' only works in PowerShell *Core*.
    # In *Windows PowerShell* you must use construct the array via *code points*,
    # as shown in the next statement.
    $alpha = [char] (65..90)
    for($i=0; $i -lt 26; $i++) {
    $translation[$alpha[((((-$i + $offset) % 26) + 26) % 26)]] = $alpha[$i]
    }
    # Add an entry to pass spaces through as-is.
    $translation[[char] ' '] = [char] ' '

    # Extract the text to be deciphered.
    $cipherText = $doc.translate.caesar_cipher.cipher

    # Translate the individual characters and reassemble them into a string.
    -join $translation[[char] $cipherText]


    The above yields:



    CONGRATULATIONS ON SUCCESSFULLY COMPLETING THE ADVANCED POWERSHELL ASSIGNMENT    


    And congratulations on successfully making us do your homework for you.





    Note:





    • PowerShell automatically provides convenient dot notation (.) to drill down into XML documents.




      • For background information and caveats, see this answer.

      • If you need sophisticated queries agains the XML DOM, use the Select-Xml cmdlet, which is XPath-based.



    • Pitfall: PowerShell often automatically treats [char] instances as [string] instances as needed, but not in the case of hashtable lookups: hashtable lookups must use the same data type as the key's data type, which is why $cipherText is cast to [char] to look up [char] instances and why adding the entry for spaces above uses an explicit [char] cast to define the key.


    • Windows PowerShell only supports numerical endpoints for .., the range operator, whereas PowerShell Core also supports characters.







    share|improve this answer



















    • 1




      Nice, didn't realize you could [char]$string
      – TheIncorrigible1
      Nov 21 at 21:48










    • @bear443: Sounds like you're using Windows PowerShell, not PowerShell Core. Only the latter supports using characters with .. to create ranges of characters. See my update for how to do it in Windows PowerShell. The updated code should now run on Windows PowerShell and PowerShell Core alike.
      – mklement0
      Nov 21 at 22:04










    • @TheIncorrigible1: Yes, it's effectively the same as $string.ToCharArray(), but I prefer [char], because it is more PowerShell-idiomatic. Performance-wise, there's virtually no difference.
      – mklement0
      Nov 21 at 22:52















    up vote
    3
    down vote



    accepted










    # The input XML.
    $xml = @'
    <?xml version="1.0" encoding="UTF-8"?>
    <translate>
    <caesar_cipher>
    <offset>-7</offset>
    <cipher>
    RFGNCTAZITALFGB FG BZRRPBBOZIIV RFHEIPALGN AMP TQYTGRPQ EFXPCBMPII
    TBBLNGHPGA
    </cipher>
    </caesar_cipher>
    </translate>
    '@

    # Read the XML text into an XML DOM (XmlDocument).
    $doc = [xml] $xml

    # Extract the offset needed to build the translation hashtable.
    $offset = $doc.translate.caesar_cipher.offset

    # Build the translation hashtable, which maps a given [char] instance
    # to a different [char] instance.
    # (The hashtable doesn't strictly need to be *ordered*.)
    $translation = [ordered] @{}
    # NOTE: 'A'..'Z' only works in PowerShell *Core*.
    # In *Windows PowerShell* you must use construct the array via *code points*,
    # as shown in the next statement.
    $alpha = [char] (65..90)
    for($i=0; $i -lt 26; $i++) {
    $translation[$alpha[((((-$i + $offset) % 26) + 26) % 26)]] = $alpha[$i]
    }
    # Add an entry to pass spaces through as-is.
    $translation[[char] ' '] = [char] ' '

    # Extract the text to be deciphered.
    $cipherText = $doc.translate.caesar_cipher.cipher

    # Translate the individual characters and reassemble them into a string.
    -join $translation[[char] $cipherText]


    The above yields:



    CONGRATULATIONS ON SUCCESSFULLY COMPLETING THE ADVANCED POWERSHELL ASSIGNMENT    


    And congratulations on successfully making us do your homework for you.





    Note:





    • PowerShell automatically provides convenient dot notation (.) to drill down into XML documents.




      • For background information and caveats, see this answer.

      • If you need sophisticated queries agains the XML DOM, use the Select-Xml cmdlet, which is XPath-based.



    • Pitfall: PowerShell often automatically treats [char] instances as [string] instances as needed, but not in the case of hashtable lookups: hashtable lookups must use the same data type as the key's data type, which is why $cipherText is cast to [char] to look up [char] instances and why adding the entry for spaces above uses an explicit [char] cast to define the key.


    • Windows PowerShell only supports numerical endpoints for .., the range operator, whereas PowerShell Core also supports characters.







    share|improve this answer



















    • 1




      Nice, didn't realize you could [char]$string
      – TheIncorrigible1
      Nov 21 at 21:48










    • @bear443: Sounds like you're using Windows PowerShell, not PowerShell Core. Only the latter supports using characters with .. to create ranges of characters. See my update for how to do it in Windows PowerShell. The updated code should now run on Windows PowerShell and PowerShell Core alike.
      – mklement0
      Nov 21 at 22:04










    • @TheIncorrigible1: Yes, it's effectively the same as $string.ToCharArray(), but I prefer [char], because it is more PowerShell-idiomatic. Performance-wise, there's virtually no difference.
      – mklement0
      Nov 21 at 22:52













    up vote
    3
    down vote



    accepted







    up vote
    3
    down vote



    accepted






    # The input XML.
    $xml = @'
    <?xml version="1.0" encoding="UTF-8"?>
    <translate>
    <caesar_cipher>
    <offset>-7</offset>
    <cipher>
    RFGNCTAZITALFGB FG BZRRPBBOZIIV RFHEIPALGN AMP TQYTGRPQ EFXPCBMPII
    TBBLNGHPGA
    </cipher>
    </caesar_cipher>
    </translate>
    '@

    # Read the XML text into an XML DOM (XmlDocument).
    $doc = [xml] $xml

    # Extract the offset needed to build the translation hashtable.
    $offset = $doc.translate.caesar_cipher.offset

    # Build the translation hashtable, which maps a given [char] instance
    # to a different [char] instance.
    # (The hashtable doesn't strictly need to be *ordered*.)
    $translation = [ordered] @{}
    # NOTE: 'A'..'Z' only works in PowerShell *Core*.
    # In *Windows PowerShell* you must use construct the array via *code points*,
    # as shown in the next statement.
    $alpha = [char] (65..90)
    for($i=0; $i -lt 26; $i++) {
    $translation[$alpha[((((-$i + $offset) % 26) + 26) % 26)]] = $alpha[$i]
    }
    # Add an entry to pass spaces through as-is.
    $translation[[char] ' '] = [char] ' '

    # Extract the text to be deciphered.
    $cipherText = $doc.translate.caesar_cipher.cipher

    # Translate the individual characters and reassemble them into a string.
    -join $translation[[char] $cipherText]


    The above yields:



    CONGRATULATIONS ON SUCCESSFULLY COMPLETING THE ADVANCED POWERSHELL ASSIGNMENT    


    And congratulations on successfully making us do your homework for you.





    Note:





    • PowerShell automatically provides convenient dot notation (.) to drill down into XML documents.




      • For background information and caveats, see this answer.

      • If you need sophisticated queries agains the XML DOM, use the Select-Xml cmdlet, which is XPath-based.



    • Pitfall: PowerShell often automatically treats [char] instances as [string] instances as needed, but not in the case of hashtable lookups: hashtable lookups must use the same data type as the key's data type, which is why $cipherText is cast to [char] to look up [char] instances and why adding the entry for spaces above uses an explicit [char] cast to define the key.


    • Windows PowerShell only supports numerical endpoints for .., the range operator, whereas PowerShell Core also supports characters.







    share|improve this answer














    # The input XML.
    $xml = @'
    <?xml version="1.0" encoding="UTF-8"?>
    <translate>
    <caesar_cipher>
    <offset>-7</offset>
    <cipher>
    RFGNCTAZITALFGB FG BZRRPBBOZIIV RFHEIPALGN AMP TQYTGRPQ EFXPCBMPII
    TBBLNGHPGA
    </cipher>
    </caesar_cipher>
    </translate>
    '@

    # Read the XML text into an XML DOM (XmlDocument).
    $doc = [xml] $xml

    # Extract the offset needed to build the translation hashtable.
    $offset = $doc.translate.caesar_cipher.offset

    # Build the translation hashtable, which maps a given [char] instance
    # to a different [char] instance.
    # (The hashtable doesn't strictly need to be *ordered*.)
    $translation = [ordered] @{}
    # NOTE: 'A'..'Z' only works in PowerShell *Core*.
    # In *Windows PowerShell* you must use construct the array via *code points*,
    # as shown in the next statement.
    $alpha = [char] (65..90)
    for($i=0; $i -lt 26; $i++) {
    $translation[$alpha[((((-$i + $offset) % 26) + 26) % 26)]] = $alpha[$i]
    }
    # Add an entry to pass spaces through as-is.
    $translation[[char] ' '] = [char] ' '

    # Extract the text to be deciphered.
    $cipherText = $doc.translate.caesar_cipher.cipher

    # Translate the individual characters and reassemble them into a string.
    -join $translation[[char] $cipherText]


    The above yields:



    CONGRATULATIONS ON SUCCESSFULLY COMPLETING THE ADVANCED POWERSHELL ASSIGNMENT    


    And congratulations on successfully making us do your homework for you.





    Note:





    • PowerShell automatically provides convenient dot notation (.) to drill down into XML documents.




      • For background information and caveats, see this answer.

      • If you need sophisticated queries agains the XML DOM, use the Select-Xml cmdlet, which is XPath-based.



    • Pitfall: PowerShell often automatically treats [char] instances as [string] instances as needed, but not in the case of hashtable lookups: hashtable lookups must use the same data type as the key's data type, which is why $cipherText is cast to [char] to look up [char] instances and why adding the entry for spaces above uses an explicit [char] cast to define the key.


    • Windows PowerShell only supports numerical endpoints for .., the range operator, whereas PowerShell Core also supports characters.








    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Nov 21 at 22:57

























    answered Nov 21 at 21:27









    mklement0

    122k20234264




    122k20234264








    • 1




      Nice, didn't realize you could [char]$string
      – TheIncorrigible1
      Nov 21 at 21:48










    • @bear443: Sounds like you're using Windows PowerShell, not PowerShell Core. Only the latter supports using characters with .. to create ranges of characters. See my update for how to do it in Windows PowerShell. The updated code should now run on Windows PowerShell and PowerShell Core alike.
      – mklement0
      Nov 21 at 22:04










    • @TheIncorrigible1: Yes, it's effectively the same as $string.ToCharArray(), but I prefer [char], because it is more PowerShell-idiomatic. Performance-wise, there's virtually no difference.
      – mklement0
      Nov 21 at 22:52














    • 1




      Nice, didn't realize you could [char]$string
      – TheIncorrigible1
      Nov 21 at 21:48










    • @bear443: Sounds like you're using Windows PowerShell, not PowerShell Core. Only the latter supports using characters with .. to create ranges of characters. See my update for how to do it in Windows PowerShell. The updated code should now run on Windows PowerShell and PowerShell Core alike.
      – mklement0
      Nov 21 at 22:04










    • @TheIncorrigible1: Yes, it's effectively the same as $string.ToCharArray(), but I prefer [char], because it is more PowerShell-idiomatic. Performance-wise, there's virtually no difference.
      – mklement0
      Nov 21 at 22:52








    1




    1




    Nice, didn't realize you could [char]$string
    – TheIncorrigible1
    Nov 21 at 21:48




    Nice, didn't realize you could [char]$string
    – TheIncorrigible1
    Nov 21 at 21:48












    @bear443: Sounds like you're using Windows PowerShell, not PowerShell Core. Only the latter supports using characters with .. to create ranges of characters. See my update for how to do it in Windows PowerShell. The updated code should now run on Windows PowerShell and PowerShell Core alike.
    – mklement0
    Nov 21 at 22:04




    @bear443: Sounds like you're using Windows PowerShell, not PowerShell Core. Only the latter supports using characters with .. to create ranges of characters. See my update for how to do it in Windows PowerShell. The updated code should now run on Windows PowerShell and PowerShell Core alike.
    – mklement0
    Nov 21 at 22:04












    @TheIncorrigible1: Yes, it's effectively the same as $string.ToCharArray(), but I prefer [char], because it is more PowerShell-idiomatic. Performance-wise, there's virtually no difference.
    – mklement0
    Nov 21 at 22:52




    @TheIncorrigible1: Yes, it's effectively the same as $string.ToCharArray(), but I prefer [char], because it is more PowerShell-idiomatic. Performance-wise, there's virtually no difference.
    – mklement0
    Nov 21 at 22:52












    up vote
    1
    down vote













    You have a couple issues with your script. First, your generation of the cipher's math is wrong. You want to pull the offset from the xml. You also want to catch the space character in your hash or it'll return $null when the lookup is performed. This is true of any other non-alpha characters unless you have them defined. Once this is addressed, all you need to do is perform the lookup and join the characters back together. You can perform multiple lookups in a dictionary by passing an array in PowerShell exemplified below.



    # initialize alpha and hash lookups
    $alpha = 'A'..'Z'
    $decipher = @{ ' ' = ' ' }

    # load prerequisite variables
    $xml = [xml]@'
    <?xml version="1.0" encoding="UTF-8"?>
    <translate>
    <caesar_cipher>
    <offset>-7</offset>
    <cipher>
    RFGNCTAZITALFGB FG BZRRPBBOZIIV RFHEIPALGN AMP TQYTGRPQ EFXPCBMPII TBBLNGHPGA
    </cipher>
    </caesar_cipher>
    </translate>
    '@
    $offset = [int]$xml.translate.caesar_cipher.offset
    $cipher = $xml.translate.caesar_cipher.cipher

    # generate decipher table
    0..($alpha.Length - 1) | % {$decipher["$($alpha[(-$_ + $offset) % $alpha.Length])"] = $alpha[$_]}

    # perform lookups
    -join $decipher[$cipher -split '']





    share|improve this answer























    • I am getting this null error frequently. Is there a way to use this in a script like mklement0 commented?
      – bear443
      Nov 21 at 21:44










    • @bear443 I used this without any error. Sounds like user-error.
      – TheIncorrigible1
      Nov 21 at 21:46















    up vote
    1
    down vote













    You have a couple issues with your script. First, your generation of the cipher's math is wrong. You want to pull the offset from the xml. You also want to catch the space character in your hash or it'll return $null when the lookup is performed. This is true of any other non-alpha characters unless you have them defined. Once this is addressed, all you need to do is perform the lookup and join the characters back together. You can perform multiple lookups in a dictionary by passing an array in PowerShell exemplified below.



    # initialize alpha and hash lookups
    $alpha = 'A'..'Z'
    $decipher = @{ ' ' = ' ' }

    # load prerequisite variables
    $xml = [xml]@'
    <?xml version="1.0" encoding="UTF-8"?>
    <translate>
    <caesar_cipher>
    <offset>-7</offset>
    <cipher>
    RFGNCTAZITALFGB FG BZRRPBBOZIIV RFHEIPALGN AMP TQYTGRPQ EFXPCBMPII TBBLNGHPGA
    </cipher>
    </caesar_cipher>
    </translate>
    '@
    $offset = [int]$xml.translate.caesar_cipher.offset
    $cipher = $xml.translate.caesar_cipher.cipher

    # generate decipher table
    0..($alpha.Length - 1) | % {$decipher["$($alpha[(-$_ + $offset) % $alpha.Length])"] = $alpha[$_]}

    # perform lookups
    -join $decipher[$cipher -split '']





    share|improve this answer























    • I am getting this null error frequently. Is there a way to use this in a script like mklement0 commented?
      – bear443
      Nov 21 at 21:44










    • @bear443 I used this without any error. Sounds like user-error.
      – TheIncorrigible1
      Nov 21 at 21:46













    up vote
    1
    down vote










    up vote
    1
    down vote









    You have a couple issues with your script. First, your generation of the cipher's math is wrong. You want to pull the offset from the xml. You also want to catch the space character in your hash or it'll return $null when the lookup is performed. This is true of any other non-alpha characters unless you have them defined. Once this is addressed, all you need to do is perform the lookup and join the characters back together. You can perform multiple lookups in a dictionary by passing an array in PowerShell exemplified below.



    # initialize alpha and hash lookups
    $alpha = 'A'..'Z'
    $decipher = @{ ' ' = ' ' }

    # load prerequisite variables
    $xml = [xml]@'
    <?xml version="1.0" encoding="UTF-8"?>
    <translate>
    <caesar_cipher>
    <offset>-7</offset>
    <cipher>
    RFGNCTAZITALFGB FG BZRRPBBOZIIV RFHEIPALGN AMP TQYTGRPQ EFXPCBMPII TBBLNGHPGA
    </cipher>
    </caesar_cipher>
    </translate>
    '@
    $offset = [int]$xml.translate.caesar_cipher.offset
    $cipher = $xml.translate.caesar_cipher.cipher

    # generate decipher table
    0..($alpha.Length - 1) | % {$decipher["$($alpha[(-$_ + $offset) % $alpha.Length])"] = $alpha[$_]}

    # perform lookups
    -join $decipher[$cipher -split '']





    share|improve this answer














    You have a couple issues with your script. First, your generation of the cipher's math is wrong. You want to pull the offset from the xml. You also want to catch the space character in your hash or it'll return $null when the lookup is performed. This is true of any other non-alpha characters unless you have them defined. Once this is addressed, all you need to do is perform the lookup and join the characters back together. You can perform multiple lookups in a dictionary by passing an array in PowerShell exemplified below.



    # initialize alpha and hash lookups
    $alpha = 'A'..'Z'
    $decipher = @{ ' ' = ' ' }

    # load prerequisite variables
    $xml = [xml]@'
    <?xml version="1.0" encoding="UTF-8"?>
    <translate>
    <caesar_cipher>
    <offset>-7</offset>
    <cipher>
    RFGNCTAZITALFGB FG BZRRPBBOZIIV RFHEIPALGN AMP TQYTGRPQ EFXPCBMPII TBBLNGHPGA
    </cipher>
    </caesar_cipher>
    </translate>
    '@
    $offset = [int]$xml.translate.caesar_cipher.offset
    $cipher = $xml.translate.caesar_cipher.cipher

    # generate decipher table
    0..($alpha.Length - 1) | % {$decipher["$($alpha[(-$_ + $offset) % $alpha.Length])"] = $alpha[$_]}

    # perform lookups
    -join $decipher[$cipher -split '']






    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Nov 21 at 21:57

























    answered Nov 21 at 21:27









    TheIncorrigible1

    9,16231334




    9,16231334












    • I am getting this null error frequently. Is there a way to use this in a script like mklement0 commented?
      – bear443
      Nov 21 at 21:44










    • @bear443 I used this without any error. Sounds like user-error.
      – TheIncorrigible1
      Nov 21 at 21:46


















    • I am getting this null error frequently. Is there a way to use this in a script like mklement0 commented?
      – bear443
      Nov 21 at 21:44










    • @bear443 I used this without any error. Sounds like user-error.
      – TheIncorrigible1
      Nov 21 at 21:46
















    I am getting this null error frequently. Is there a way to use this in a script like mklement0 commented?
    – bear443
    Nov 21 at 21:44




    I am getting this null error frequently. Is there a way to use this in a script like mklement0 commented?
    – bear443
    Nov 21 at 21:44












    @bear443 I used this without any error. Sounds like user-error.
    – TheIncorrigible1
    Nov 21 at 21:46




    @bear443 I used this without any error. Sounds like user-error.
    – TheIncorrigible1
    Nov 21 at 21:46










    up vote
    0
    down vote













    As TheIncorrigible1 suggests, you can use the XPath expression //cipher/text() to select the desired text nodes.



    $xml = [xml](Get-Content pathtofile.xml)

    $Ciphers = $xml.SelectNodes('//cipher/text()').InnerText
    foreach($Cipher in $Ciphers){
    Write-Host "Cipher text:`n$Cipher" -ForegroundColor Magenta
    Write-Host "Decrypted text:`n$(-join ($Cipher.ToCharArray() |ForEach-Object {
    # if it's in the set A..Z, translate
    if($_ -in $alpha){
    $_ = $translation[$_]
    }
    $_
    }))" -ForegroundColor Green
    }





    share|improve this answer



























      up vote
      0
      down vote













      As TheIncorrigible1 suggests, you can use the XPath expression //cipher/text() to select the desired text nodes.



      $xml = [xml](Get-Content pathtofile.xml)

      $Ciphers = $xml.SelectNodes('//cipher/text()').InnerText
      foreach($Cipher in $Ciphers){
      Write-Host "Cipher text:`n$Cipher" -ForegroundColor Magenta
      Write-Host "Decrypted text:`n$(-join ($Cipher.ToCharArray() |ForEach-Object {
      # if it's in the set A..Z, translate
      if($_ -in $alpha){
      $_ = $translation[$_]
      }
      $_
      }))" -ForegroundColor Green
      }





      share|improve this answer

























        up vote
        0
        down vote










        up vote
        0
        down vote









        As TheIncorrigible1 suggests, you can use the XPath expression //cipher/text() to select the desired text nodes.



        $xml = [xml](Get-Content pathtofile.xml)

        $Ciphers = $xml.SelectNodes('//cipher/text()').InnerText
        foreach($Cipher in $Ciphers){
        Write-Host "Cipher text:`n$Cipher" -ForegroundColor Magenta
        Write-Host "Decrypted text:`n$(-join ($Cipher.ToCharArray() |ForEach-Object {
        # if it's in the set A..Z, translate
        if($_ -in $alpha){
        $_ = $translation[$_]
        }
        $_
        }))" -ForegroundColor Green
        }





        share|improve this answer














        As TheIncorrigible1 suggests, you can use the XPath expression //cipher/text() to select the desired text nodes.



        $xml = [xml](Get-Content pathtofile.xml)

        $Ciphers = $xml.SelectNodes('//cipher/text()').InnerText
        foreach($Cipher in $Ciphers){
        Write-Host "Cipher text:`n$Cipher" -ForegroundColor Magenta
        Write-Host "Decrypted text:`n$(-join ($Cipher.ToCharArray() |ForEach-Object {
        # if it's in the set A..Z, translate
        if($_ -in $alpha){
        $_ = $translation[$_]
        }
        $_
        }))" -ForegroundColor Green
        }






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Nov 21 at 22:54









        mklement0

        122k20234264




        122k20234264










        answered Nov 21 at 21:15









        Mathias R. Jessen

        55.3k45399




        55.3k45399






























             

            draft saved


            draft discarded



















































             


            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53420312%2fhashtable-lookup%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            What visual should I use to simply compare current year value vs last year in Power BI desktop

            Alexandru Averescu

            Trompette piccolo