Попытка сделать функцию такой же надежной, как веб-сайт (BASE64)

#powershell

Вопрос:

Если я предоставлю этот сайт https://www.base64decode.org/ такие данные, как NnFjamFvOGw5NnA1Y2Y2MHNtamlxb2drNzVfMjAyMTEwMjFUMTcwMDAwWiB

Я получаю такой результат, как 6qcjao8l96p5cf60smjiqogk75_20211021T170000Z

если я запущу следующие строки PS

 $Encoding = 'default'
$Result = [System.Text.Encoding]:: $Encoding.GetString([System.Convert]::FromBase64String('NnFjamFvOGw5NnA1Y2Y2MHNtamlxb2drNzVfMjAyMTEwMjFUMTcwMDAwWiB'))
 

Я получаю ошибку

 Exception calling "FromBase64String" with "1" argument(s): "Invalid length for a Base-64 char array 
or string."
At line:1 char:1
  $Result = [System.Text.Encoding]:: $Encoding.GetString([System.Conver ...
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
      FullyQualifiedErrorId : FormatException
 

Я даже попытался дополнить строку, которая иногда работает, а иногда нет, в зависимости от строки. (Я не уверен, почему обивка не всегда работает)

 function Get-PaddingRequired {
            param (
                [Parameter(Mandatory = $true)]
                [String]$InputString
            )
            $modulo = ($InputString.Length % 3)
       
            switch ($modulo) {
                0 { $paddingRequired = $null }
                1 { $paddingRequired = '==' }
                2 { $paddingRequired = '=' }
            }
            Return [string]$paddingRequired
        }
 

Работает NnFjamFvOGw5NnA1Y2Y2MHNtamlxb2drNzVfMjAyMTEwMjFUMTcwMDAwWiB в моей функции заполнения выше. К сожалению, я получаю только один = правильный ответ == , который, похоже, сбивает с толку.

Должен быть лучший способ стать более надежным, как сайт https://www.base64decode.org/. Идеи ?

Комментарии:

1. Функция заполнения выглядит для меня нормально. Ваша примерная строка состоит из 59 символов, поэтому = правильное заполнение должно делить ее на 3.

2. Ошибка здесь: $Result = [System.Text.Encoding]:: $Encoding.GetString( должно быть [System.Text.Encoding]::Default.GetString(

3. Ваш цитируемый веб-сайт пропускает непечатаемые байты. Это заставляет вас думать, что неправильная строка BASE64 является правильной. Я бы не счел это более «надежным». NnFjamFvOGw5NnA1Y2Y2MHNtamlxb2drNzVfMjAyMTEwMjFUMTcwMDAwWiB= является правильной строкой BASE64. Использовать utilities-online.info/base64 чтобы увидеть разницу.

4. @zett42 мы согласны. но когда я NnFjamFvOGw5NnA1Y2Y2MHNtamlxb2drNzVfMjAyMTEwMjFUMTcwMDAwWiB= ввожу $Encoding = 'default' $Result = [System.Text.Encoding]:: $Encoding.GetString([System.Convert]::FromBase64String('NnFjamFvOGw5NnA1Y2Y2MHNtamlxb2drNzVfMjAyMTEwMjFUMTcwMDAwWiB=')) , я все равно получаю ошибку, как написано в моем вопросе.

5. У вас есть пространство перед $Encoding.GetString(...) которым не должно быть

Ответ №1:

Основная проблема с вашим кодом вызвана простой опечаткой

Уберите пространство, которое у вас есть перед $Encoding этим:

 $Result = [System.Text.Encoding]:: $Encoding.GetString([System.Convert]::FromBase64String(...))
#                                 ^