Пакет PHP / распаковать в Go - PullRequest
       21

Пакет PHP / распаковать в Go

1 голос
/ 27 сентября 2019

Я намереваюсь переписать игровой сервер, который у меня уже работает в PHP-cli.

Поскольку я не могу прикоснуться к клиенту, я должен использовать сетевой протокол как есть.Это чистый двоичный формат с несколькими полями на пакет.Я использую модифицированную версию команд PHP pack / unpack для преобразования в и из этого.Пакет обычно имеет вид:

заголовок:

unpack('nitem/ncmdNum/NdataLen', $buf);

data:

любая из нескольких десятков последовательных последовательностей распаковки, как указано в cmdNum.Например:

  • a32first_name/a32second_name/a32third_name/nfirst_itemid/nfirst_flags/nfirst_level/nunused/Nfirst_perm_flags/Ncvsize/a{$cvsize}contentsVector

  • nsuccess/ndummyfielda/a*xerror_msg/a*xtext/NcurrentVersion/NtimeLimit/a*xlimitValue/a*xlimit

[Где a{$cvsize} означаетстрока фиксированной длины, определяемая именованным (обычно непосредственно предшествующим) значением, а * означает строку переменной длины с нулевым символом в конце.]

Текущая реализация PHP распаковывает ее и вызывает функцию, которая имеет дело скоманда 'cmdNum', передающая ассоциативный массив, содержащий распакованные данные.Это, в свою очередь, вызывает отправляющий код с аналогичным массивом для возвращаемых значений.

Хотя я уверен, что могу сопоставить их со структурами, чтение из ввода (и запись в него) не будет простоДело в том, чтобы сбросить буфер над структурой.Кроме того, большинство типов пакетов используются только один раз, в функции, предназначенной для работы с этим сообщением, поэтому кодирование нескольких десятков структур и кода для загрузки каждого поля по отдельности кажется большой работой.

Есть ли какой-либо метод или пакет, который я могу использовать в качестве основы для работы с такого рода вещами?Мой поиск "php unpack in go", кажется, только возвращает результаты, основанные на людях, распаковывающих одно числовое значение, которое, очевидно, достаточно легко заменить на encoding / binary!

Строки unpack / pack генерируются автоматическикаким-то другим PHP, основанным на спецификации, полученной от клиента, так что я мог бы изменить это, чтобы довольно легко создать другой формат, если есть что-то, что я могу использовать.У меня обычно не было бы проблем с написанием своих собственных функций для такого рода вещей, но, будучи совершенно новым для Go, это может быть слишком сложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...