Как хранить данные в base126?
Я хочу закодировать произвольные двоичные данные в массив байтов. Однако допустимые значения данных в каждом закодированном байте находятся в диапазоне 1–127 включительно. Другими словами, недопустимыми значениями закодированных байтов являются 0 и 128–255. Другими словами, я не могу использовать старший бит (он должен быть равен нулю), а значение не может быть равно 0. Таким образом, в каждом байте можно закодировать 126 значений. Я знаю, как решить эту проблему, используя 6 бит на байт, просто сохраняя данные в битах 2–7, оставляя бит 1 всегда равным 1, а бит 8 всегда 0. Но мне хотелось бы добиться большего.
У меня такое ощущение, что это вопрос «базы», поскольку мое предыдущее решение с 6 битами похоже на base64, но с другой таблицей. Итак, это то, что я хотел бы изучить, называемое кодировкой base126?
Почему я хочу использовать эту схему кодирования base126 (?) потому, что я хотел бы улучшить свои сценарии Lua в игре под названием Dual Universe, где передача данных между излучателями и получателями ограничена. По какой-то причине игра не может обрабатывать строку с нулевым символом в ней, а строки (которые используются для передачи) закодированы в utf8, поэтому я не хочу трогать самый значимый бит (иначе он ожидает многобайтовые символьные данные ). Я хочу отправить двоичные данные по этой строке с этими ограничениями.
Я не знаю, лаю ли я по дереву, но у меня такое чувство, что мне следует думать о данных, которые я хочу закодировать, как о большом числе, разделить и по модулю на 126 и прибавить 1, но я не знаю, как для такой работы с большими массивами.
Я был бы рад, если бы мне посоветовали поискать где-нибудь, где можно хранить данные таким образом. Я разобрался в некоторых ООП/процедурных языках, поэтому они не обязательно должны быть специфичными для Lua. Тем временем я рассмотрю base85, потому что это во многом похоже на то, что я хочу сделать, основываясь на моих собственных догадках. Возможно, я получу там некоторые идеи.