Private KeeperPrivate Keeper
Объект PK

Файлы и кодирование

Все 10 методов PK для Base64, адресов, системной кодировки, шестнадцатеричной записи, загрузки и сохранения файлов.

Объект PK предоставляет 10 методов для файлов и кодирования. Они меняют представление данных или передают байты через строку, но не шифруют содержимое и не защищают его от чтения.

Base64 и шестнадцатеричная запись не скрывают данные

Обе формы восстанавливаются без ключа. Используйте их для передачи байтов через текстовое поле. Для защиты данных нужен метод шифрования и отдельное безопасное хранение ключа.

Что выбрать

Обычный текст и Base64

PK.base64 и PK.decodeBase64 подходят для совместимых исторических полей. Для однозначного UTF-8 и выбора алфавита используйте PK.baseEncodeDecode.

Одно значение адреса

PK.urlEncode кодирует значение параметра, а PK.urlDecode выполняет одно обратное преобразование. Готовый адрес целиком обычно кодировать не нужно.

Загрузить удалённый файл

PK.fileToBase64 отправляет запрос GET по адресу и возвращает Base64 сырых байтов ответа. Локальный путь этот метод не читает.

Сохранить файл сеанса

PK.saveFile записывает текст UTF-8 или декодированные из Base64 байты. Путь, действие, тип и данные передаются одной строкой через |.

Текст, байты и их запись

Перед вызовом определите, что именно хранит строка. Это исключает частую ошибку, когда Base64 декодируют как текст, хотя внутри находится изображение или архив.

Текст

demo — четыре символа. Чтобы сохранить их как байты, сначала нужна кодировка символов: историческая системная или явно заданная UTF-8.

Байты

В UTF-8 текст demo представлен байтами 64 65 6D 6F в шестнадцатеричной записи.

Base64

Те же байты записываются как ZGVtbw==. Это печатная строка, из которой байты можно восстановить без потерь.

decodeBase64 и baseEncodeDecode после восстановления байтов пытаются вернуть текст. hexToBase64 сохраняет сами байты и меняет только их печатную форму.

Простая пара Base64

PK.base64(input)

Кодирует строку через историческое преобразование в системную кодировку Windows и возвращает обычную строку Base64 с заполнением =.

Параметр

input: string — исходный текст.

Результат

string — Base64 байтов в системной кодировке.

Изменение

Состояние проекта не меняется.

const encoded = PK.base64("demo");
// encoded === "ZGVtbw=="

Для латиницы результат однозначен. Для кириллицы и других знаков он зависит от системной кодовой страницы, поэтому для новых обменных форматов предпочтительнее baseEncodeDecode с явным UTF-8. Исходная операция подробно описана в справке по BASE64.

Значение внутри адреса

PK.urlEncode(input)

Преобразует одно строковое значение в процентную запись. Пробел становится %20; знаки =, &, ?, #, двоеточие и косая черта также кодируются.

Параметр

input: string — одно значение, а не весь готовый адрес.

Результат

string — процентная запись значения.

Изменение

Состояние проекта не меняется.

const query = PK.urlEncode("Data Export & Каталог");
const url = "https://example.com/search?q=" + query;

Не передавайте в метод строку https://example.com/a?x=1 целиком: служебные знаки адреса превратятся в данные. Точный набор преобразований показан в справке по URLENCODE.

Исправить строку из системной кодировки

PK.ansiToUTF8(input)

Повторно преобразует строку через текущую системную кодовую страницу Windows. Метод нужен только для подтверждённого искажения, когда байты системной кодировки были прочитаны как другой текст.

Параметр

input: string — уже отображаемая, но искажённая строка.

Результат

string — исправленный текст либо исходная строка, если надёжного результата нет.

Изменение

Состояние проекта не меняется.

const repaired = PK.ansiToUTF8("Êàòàëîã òîâàðîâ");
// На Windows с русской кодовой страницей: "Каталог товаров"

Результат зависит от кодовой страницы компьютера. Если преобразование даёт пустую строку или знак замены , метод возвращает исходный текст, поэтому совпадение результата со входом не доказывает правильность исходной кодировки. Граница применения объяснена в справке по ANSITOUTF8.

Загрузить файл как Base64

PK.fileToBase64(input)

Отправляет запрос GET по переданному адресу через текущую прокси, загружает всё тело ответа в память и возвращает Base64 полученных байтов. Несмотря на старое описание параметра как пути, фактический метод работает с сетевым адресом, а не с локальным файлом.

Параметр

input: string — полный адрес ответа, например https://example.com/image.png.

Результат

string — Base64 сырых байтов тела либо строка транспортной ошибки.

Изменение

Выполняется отдельный запрос GET через текущую прокси; результат нужно брать из возвращённой строки.

const imageBase64 = PK.fileToBase64(
  "https://example.com/assets/logo.png"
);

Метод не обещает перенести свой внутренний ответ в PK.response, PK.headers или типизированные сетевые свойства, поэтому не используйте их как подтверждение этой загрузки. Он также не проверяет назначение тела: если сервер вернул страницу ошибки, её байты тоже могут стать корректной строкой Base64. Всё тело и увеличенная примерно на треть строка одновременно находятся в памяти, поэтому не применяйте метод к файлам неизвестного или неограниченного размера.

Транспортная ошибка может оставить вызов в бесконечных повторах

Исполнитель намерен ограничить число повторов, но не увеличивает внутренний счётчик. Пока транспортная ошибка сохраняется, он ждёт одну секунду и повторяет тот же запрос без фактического предела. Не используйте этот метод как проверку недоступного узла и не запускайте массовую обработку без заранее подтверждённого адреса и маршрута.

Сетевое поведение и расход памяти подробнее описаны в справке по FILETOBASE64.

Между Base64 и шестнадцатеричной записью

PK.hexToBase64(input)

Читает каждые два шестнадцатеричных знака как один байт и возвращает Base64 этих байтов.

Параметр

input: string — чётное число знаков 0–9, A–F или a–f.

Результат

string — Base64 либо текст ошибки.

Изменение

Состояние проекта не меняется.

const encodedByte = PK.hexToBase64("A8");
// encodedByte === "qA=="

Нечётная длина возвращает Error: Invalid hex input: Length must be even. Исполнитель не убеждается, что преобразовал каждый знак, поэтому вход чётной длины с посторонним знаком способен дать правдоподобную, но неверную строку. Проверяйте алфавит на границе, где получаете внешние данные. Точная пара представлений приведена в справке по HEXTOBASE64.

Несколько алфавитов

PK.baseEncodeDecode(input)

Принимает строку JSON, кодирует поле message выбранным алфавитом или декодирует его и читает восстановленные байты как UTF-8. Передавайте объект через JSON.stringify, чтобы кавычки и обратные косые черты значения были оформлены однозначно.

Параметр

input: string — строковое представление одного объекта с обязательными полями.

Результат

string — закодированная строка, текст UTF-8 после декодирования либо обычная строка ошибки с началом Error: .

Изменение

Состояние проекта не меняется.

const source = "Привет";

const encoded = PK.baseEncodeDecode(JSON.stringify({
  algorithm: "Base64",
  action: "encode",
  message: source,
}));

const decoded = PK.baseEncodeDecode(JSON.stringify({
  algorithm: "Base64",
  action: "decode",
  message: encoded,
}));

if (decoded !== source) {
  throw new Error("Обратное преобразование не восстановило исходный текст");
}

Поля и алгоритмы

algorithm

Обязательная строка с точным регистром: Base16, Base32, Base64, Base58BitCoin, Base58Ripple, Base58Flickr, Base58Custom, Ascii85 или Z85.

action

Обязательная строка encode или decode в нижнем регистре.

message

Обязательная строка: исходный текст для кодирования или печатная строка для декодирования.

usePadding

Необязательное логическое значение только для кодирования Base64. По умолчанию true; значение false удаляет конечные =.

customAlphabet

Необязательная строка только для Base58Custom. Для обратимости обе стороны должны передать один и тот же допустимый алфавит из 58 уникальных знаков.

Имена полей, действий и алгоритмов чувствительны к регистру. Z85 принимает число исходных байтов, кратное четырём, а при декодировании — число знаков, кратное пяти. Ошибки возвращаются в том же строковом типе, что и успешный текст, поэтому произвольный результат, действительно начинающийся с Error: , неотличим от сообщения исполнителя. Не угадывайте успех по словам: проверяйте заранее известный формат или, как в примере выше, точное обратное преобразование.

Все алгоритмы, ограничения и поля подробно разобраны в справке по BASEENCODEDECODE.

Сохранить файл

PK.saveFile(input)

Сохраняет текст в UTF-8 или декодирует Base64 в байты. Относительный путь отсчитывается от каталога результатов текущего сеанса. Метод принимает одну строку с полями, разделёнными знаком |:

имя файла|действие|данные
имя файла|действие|text|данные
имя файла|действие|bytes|данные Base64
Параметр

input: string — путь, действие, необязательный тип и данные в одной строке.

Результат

string — точное сообщение об успехе, проверке в студии или ошибке.

Изменение

Создаётся или изменяется файл; недостающие каталоги также создаются.

Текстовый файл:

const result = PK.saveFile(
  "reports\\result.txt|overwrite|text|Состояние: готово"
);

if (result !== "File saved successfully") {
  throw new Error(result);
}

Двоичный файл из Base64:

const result = PK.saveFile(
  "reports\\hello.bin|overwrite|bytes|SGVsbG8h"
);

if (result !== "File saved successfully") {
  throw new Error(result);
}

В hello.bin попадут байты Hello!, а не знаки SGVsbG8h. Для типа text перевод строки не добавляется автоматически. Если данные содержат |, все части после служебных полей снова соединяются, поэтому знак сохраняется:

const data = "left|right";
const result = PK.saveFile(
  "reports\\parts.txt|overwrite|text|" + data
);

Данные дополнительно выполняются как in-Line

Путь, действие и тип остаются статическими частями строки, а поле данных проходит через исполнитель in-Line перед записью. Если произвольный внешний текст содержит запись функции in-Line, он может быть вычислен вместо буквального сохранения. Не используйте saveFile как прозрачную запись недоверенного необработанного содержимого без отдельного договора на допустимые данные.

Действия и результаты

overwrite

Создаёт файл или полностью заменяет содержимое. Точный результат: File saved successfully.

append

Создаёт отсутствующий файл или дописывает точно в конец. Точный результат: Data appended successfully.

increment

При совпадении имени создаёт _1, затем _2. Результат: File saved successfully as <имя>.

Названия действий и типов не зависят от регистра. В студии файл не создаётся: после проверки параметров метод возвращает Success (in studio you can't save files). Эта строка подтверждает только проверку в студии, а не запись на диск.

Путь должен быть фиксированным и доверенным

Относительный путь с .. не запрещён и способен выйти за каталог сеанса. Не составляйте имя файла из ответа сайта, входной строки или данных пользователя. Используйте заранее заданный относительный путь без ..; абсолютный путь с буквой диска допустим, но привязывает проект к одному компьютеру.

Полный договор действий, путей, студии и строк ошибок приведён в справке по SAVEFILE.