Можно ли как-то "из коробки" или с помощью готовых решений в PHP реализовать такого рода кодирование https://en.wikipedia.org/wiki/Variable-length_quantity ?
В C# такое есть в BinaryWriter, хотелось бы нечто подобного и для PHP
Пробовал pack, но при его использовании и при сравнении с результатом на C# результирующая строка отличается.
Опишу чуть подробнее. На C# в BinaryWriter пишется последовательность значений типа integer. Итоговый результат кодируется в base64.
На выходе получается что-то вроде AAEBAQcAAAQBAwIDAwMEAw==
На PHP результат совсем другой.
MUTOgen4eg: так вам base64 кодирование нужно? base64_encode(): сначала pack'ом перевести ваше сверхдлинное число в бинарную строку, а её закодировать base64_encode().
Скрипт должен обрабатывать массив данных по определенному алгоритму и писать значения в бинарную строку, а затем кодироваться в base64.
По идее скрипт это и должен делать, но он выдает такой результат:
AAAAAAEAAAABAAAAAQAAAAcAAAAAAAAAAAAAAAQAAAABAAAAAgAAAAMAAAAEAAAA
Должно же выдавать такое:
AAEBAQcAAAQBAwIDAwMEAw==
MUTOgen4eg: во втором, «правильном» варианте у вас записано всего 16 байт. В коде вы не привели функцию countCards(). поэтому сложно судить о том, что там подаётся на вход.
Сергей Соколов: Вообще последний вариант, что я пробовал был с pack('L',...)
То есть согласно документации это "беззнаковый long (всегда 32 бит, машинный порядок)"
Кстати на C# запись значения выглядит так:
var ms = new MemoryStream();
var bytes = VarInt.GetBytes((ulong)value);
ms.Write(bytes, 0, bytes.Length);
MUTOgen4eg: ну вот C#-вариант выдаёт всего 16 байт. На PHP если вы жмёте "1" как 32 бита, "0" как 32, и т.д. – длина получается намного больше. Есть подозрение, что всё же выделяется 1 бит на "1", 1 бит на "0", 3 бита на heroes и т.п. Может такое быть?
Сергей Соколов: Возможно это так. Можно ли как-то проверить это? Pack я так понимаю для этих целей не подходит.
К слову, описание алгоритма такое: https://hearthsim.info/docs/deckstrings/ начиная с раздела Format. Возможно что-то я неверно трактовал.
MUTOgen4eg: аа, теперь понятно! Извините, невнимательно прочитал исходную ссылку в вопросе. В самом PHP такой функции нет, но алгоритм легко реализуется, можно взять готовое решение, например, axypro/codecs-base64vlq.
Сергей Соколов: спасибо за ссылку, такого решения не нагуглил почему-то. Нашел еще ошибку в алгоритме скрипта, в последнем цикле надо добавлять оба значения элемента массива.
Трансформировал скрипт в следующее: