Как декодировать строку Base64?
У меня есть обычная строка в Powershell, которая из текстового файла, содержащего текст Base64; он хранится в $x
. Я пытаюсь расшифровать его так:
$z = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($x));
Это работает, если $x
была строкой Base64, созданной в Powershell (но это не так). И это не работает со строкой $x
Base64, полученной из файла, $z
просто заканчивается как что-то вроде 䐲券
.
Что мне не хватает? Например, $x
может быть YmxhaGJsYWg=
который является Base64 для blahblah
.
В двух словах, YmxhaGJsYWg=
находится в текстовом файле, затем помещается в строку в этом коде Powershell, и я пытаюсь декодировать его, но в итоге 䐲券
и т.д.
Ответы
Ответ 1
Разве кодирование не переводит текст в base64, а декодирование не возвращает base64 BACK к тексту? Вы, кажется, смешиваете их здесь. Когда я декодирую с помощью этого онлайн-декодера, я получаю:
BASE64: blahblah
UTF8: nVnV
не наоборот. Я не могу воспроизвести его полностью в PS, хотя. Смотрите образец ниже:
PS > [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("blahblah"))
nV�nV�
PS > [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("nVnV"))
blZuVg==
РЕДАКТИРОВАТЬ Я считаю, что вы используете не тот кодировщик для вашего текста. Кодированная строка base64 кодируется из строки UTF8 (или ASCII).
PS > [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("YmxhaGJsYWg="))
blahblah
PS > [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String("YmxhaGJsYWg="))
汢桡汢桡
PS > [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String("YmxhaGJsYWg="))
blahblah
Ответ 2
Эта страница отображается, когда вы Google, как конвертировать в base64, поэтому для полноты:
$b = [System.Text.Encoding]::UTF8.GetBytes("blahblah")
[System.Convert]::ToBase64String($b)
Ответ 3
Кодирование Base64 преобразует три 8-битных байта (0-255) в четыре 6-битных байта (0-63 aka base64). Каждый из четырех байтов индексирует строку ASCII, которая представляет конечный вывод как четыре 8-битных символа ASCII. Индексированная строка, как правило, "A-Za-z0-9 +/" с '=' используется как дополнение. Вот почему закодированные данные на 4/3 больше.
Базовое декодирование - это обратный процесс. И, как и следовало ожидать, декодированные данные имеют длину 3/4.
В то время как кодирование base64 может кодировать простой текст, его реальным преимуществом является кодирование непечатаемых символов, которые могут быть интерпретированы передачей систем в качестве управляющих символов.
Я предлагаю, чтобы оригинальный плакат отображал $z как байты с каждым битом, имеющим смысл для приложения. Предоставление непечатаемых символов в виде текста обычно вызывает Unicode, который генерирует глифы на основе локализации вашей системы.
Base64decode ( "Ответ на жизнь Вселенной и всего" ) = 00101010
Ответ 4
Нет собственных команд PowerShell для преобразования Base64 - пока (по состоянию на PowerShell Core 6.2.0), но было предложено добавить выделенные командлеты.
На данный момент прямое использование .NET необходимо.
Важно:
-
Кодирование Base64 - это кодирование двоичных данных с использованием байтов, значения которых ограничены четко определенным 64-символьным поддиапазоном набора символов ASCII, представляющих печатаемые символы, разработанным в то время, когда отправка произвольных байтов была проблематичной, особенно с набором старших битов ( значения байтов> 0x7f).
-
Следовательно, вы всегда должны явно указывать, что символьная кодировка байтов Base64 должна представлять.
Ergo:
-
при преобразовании в Base64 вы должны сначала получить байтовое представление строки, которую вы пытаетесь кодировать, используя кодировку символов, которую ожидает потребитель строки Base64.
-
при преобразовании FROM Base64 необходимо интерпретировать результирующий массив байтов как строку, используя ту же кодировку, которая использовалась для создания представления Base64.
Примеры:
Замечания:
-
Следующие примеры конвертируют в и из строк в кодировке UTF-8:
-
Чтобы преобразовать в и из UTF-16LE ("Unicode") вместо этого, вместо [Text.Encoding]::Unicode
[Text.Encoding]::UTF8
Конвертировать в Base64:
PS> [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes('Motörhead'))
TW90w7ZyaGVhZA==
Конвертировать из Base64:
PS> [Text.Encoding]::Utf8.GetString([Convert]::FromBase64String('TW90w7ZyaGVhZA=='))
Motörhead
Ответ 5
У меня были проблемы с пробелами между моим выпуском, и не было ответа в Интернете, чтобы исправить эту проблему. Я буквально трачу много часов, пытаясь найти решение, и нашел, что он играет с кодом до такой степени, что почти не знал, что я набрал в то время, когда я получил его на работу. Вот мое исправление для проблемы: [System.Text.Encoding]::UTF8.GetString(([System.Convert]::FromBase64String($base64string)|?{$_}))