Проверьте, что строка закодирована в Base64 в PowerShell

Я использую PowerShell для выбора условия, мне нужно определить, закодирована ли строка в Base64,

Какой самый простой и прямой путь?

            if ($item -is [?base64])
            {
                # handle strings or characters
            }
stackoverflow.com/questions/47397185/…
mjwills 26.12.2020 14:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
1 791
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Следующее возвращает $true, если $item содержит допустимую строку в кодировке Base64, и $false в противном случае:

try { $null=[Convert]::FromBase64String($item); $true } catch { $false }
  • В приведенном выше примере используется System.Convert.FromBase64String, чтобы попытаться преобразовать входную строку $item в массив байтов, который она представляет.

  • Если вызов выполнен успешно, выходной массив байтов игнорируется ($null = ...) и выводится $true.

  • В противном случае вводится блок catch и возвращается $false.

Предостережение: даже обычные строки могут быть случайно технически допустимыми строками в кодировке Base64, а именно, если они содержат только символы из набора символов Base64, а количество символов кратно 4. Например, приведенный выше тест дает $true для "word" (только символы Base64 и число, кратное 4), но не для "words" (не кратное 4 символам).


Например, в контексте утверждения if:

  • Примечание. Чтобы оператор try / catch служил выражением в условном выражении if, необходимо использовать $(), оператор подвыражения .
# Process 2 sample strings, one Base64-encoded, the other not.
foreach ($item in 'foo', 'SGFwcHkgSG9saWRheXM=') {

  if ($(try { $null=[Convert]::FromBase64String($item); $true } catch { $false })) {
    'Base64-encoded: [{0}]; decoded as UTF-8: [{1}]' -f
       $item,
       [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($item))
  }
  else {
    'NOT Base64-encoded: [{0}]' -f $item
  }

}

Вышеизложенное дает:

NOT Base64-encoded: [foo]
Base64-encoded: [SGFwcHkgSG9saWRheXM=]; decoded as UTF-8: [Happy Holidays]

Функциональность легко обернуть в пользовательскую вспомогательную функцию, Test-Base64:

# Define function.
# Accepts either a single string argument or multiple strings via the pipeline.
function Test-Base64 {
  param(
    [Parameter(ValueFromPipeline)] 
    [string] $String
  )
  process {
    try { $null=[Convert]::FromBase64String($String); $true } catch { $false }
  }
}

# Test two sample strings.
foreach ($item in 'foo', 'SGFwcHkgSG9saWRheXM=') {
  if (Test-Base64 $item) {
    "YES: $item"
  }
  else {
    "NO: $item"
  }
}

Для получения информации о преобразовании байтов в строки в кодировке Base64 и обратно см. этот ответ.

Другие вопросы по теме