.NET Remoting: Binary Format распаковка в жсон и обратно

8 000 руб. за проект
30 марта 2022, 21:39 • 2 отклика • 54 просмотра
Описание принципа работы и ограничения для Решения.

# Проблематика

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

Важно: все объекты в словаре обязаны кодироваться в жсон нативно (без использования дополнительных энкодеров)

Таким образом у нас обязана получиться конвертилка из nrbf → python dict → json → nrbf.

# Ожидания от решения

- Решение предоставляется в виде скрипта (может быть библиотеки) которое принимает на вход `BytesIO` и выполняется операции по распаковывания/раскладыванию в различные структуры/примитивы.

Примерная изначальная структура исполняющего файла/entrypoints

```jsx
def main(filename):
with open(filename, "rb") as fd:
# Execution_logic
execute(BytesIO(fd.read())

if __name__ == "__main__":
main("filename.dat")

```

В самом скрипте не создавать никаких файлов на файловой системе, папок и других вещей, которые могут храниться на физических носителях.

> Для случаев отладки стоит объекты байтио дампить в файл, но только при помощи сторонней логики.
>

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

```jsx
{
"_class_name": "WarnetObjectData",
"ObjectID": "Meja Low",
"ObjectPos": {
"_class_name": "UnityEngine_Vector3",
"x": -4.6679840087890625,
"y": 0.41775578260421753,
"z": 15.084839820861816
}
```

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

# Примеры реализации

- спецификация от майкрософт [https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nrbf/75b9fe09-be15-475f-85b8-ae7b7558cfe5](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nrbf/75b9fe09-be15-475f-85b8-ae7b7558cfe5)
- классный разбор на стек оверфлоу как файл устроен внутри [https://stackoverflow.com/questions/3052202/how-to-analyse-contents-of-binary-serialization-stream/30176566#30176566](https://stackoverflow.com/questions/3052202/how-to-analyse-contents-of-binary-serialization-stream/30176566#30176566)
- шикарная реализация читателя, но увы сразу дампят в жсон из кастомных классов или именнованных кортежей [https://github.com/gurnec/Undo_FFG/blob/master/nrbf.py](https://github.com/gurnec/Undo_FFG/blob/master/nrbf.py)
- [https://github.com/addisonElliott/pypdn/blob/s/pypdn/nrbf.py#L218](https://github.com/addisonElliott/pypdn/blob/s/pypdn/nrbf.py#L218) неплохое решение, даже более читаемое пусть и базируется на предыдущем

# Тестовые файлы

[https://disk.yandex.by/d/g0pgvoSyYh4PPA](https://disk.yandex.by/d/g0pgvoSyYh4PPA)