Подтвердить что ты не робот

Как декодировать строку 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, и я пытаюсь декодировать его, но в итоге 䐲券 и т.д.

4b9b3361

Ответ 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)|?{$_}))