Я использую PowerShell для выбора условия, мне нужно определить, закодирована ли строка в Base64,
Какой самый простой и прямой путь?
if ($item -is [?base64])
{
# handle strings or characters
}





Следующее возвращает $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 и обратно см. этот ответ.