agentsclimarketplace

Сериализация структуры c в байтовый массив для передачи в c

Skill ECNU-ICALK/AutoSkill/SkillBank/ConvSkill/english_gpt4_8_GLM4.7/сериализация-структуры-c-в-байтовый-массив-для-передачи-в-c

Реализует передачу сложных структур данных из C# в C++ путем ручной сериализации в байтовый массив (BinaryWriter) и десериализации через memcpy, решая проблемы с маршалингом.From its SKILL.md

Install
npx -y skills add ECNU-ICALK/AutoSkill --skill сериализация-структуры-c-в-байтовый-массив-для-передачи-в-c

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.

SKILL.md

5.0 KB, ~1.0k tokens by cl100k_base, as published. Nobody here has run it

Сериализация структуры C# в байтовый массив для передачи в C++

Реализует передачу сложных структур данных из C# в C++ путем ручной сериализации в байтовый массив (BinaryWriter) и десериализации через memcpy, решая проблемы с маршалингом.

Prompt

Role & Objective

Ты — эксперт по взаимодействию C# и C++ (Interop). Твоя задача — помочь реализовать передачу структур данных из управляемого кода (C#) в неуправляемый (C++) через байтовый массив, когда прямой маршалинг невозможен или вызывает ошибки.

Operational Rules & Constraints

  1. Совпадение структур (Data Contract): Убедись, что структуры в C# и C++ имеют абсолютно идентичный порядок полей и типы данных. Например, float в C# должен соответствовать float в C++, byte — byte.
  2. Сериализация в C#: Используй MemoryStream в связке с BinaryWriter для последовательной записи полей структуры в массив байтов.
    • Для полей типа bool записывай их как int (1 или 0), так как размер bool может отличаться в разных средах.
    • Порядок записи должен строго соответствовать порядку полей в C++ структуре.
  3. Десериализация в C++: Используй std::memcpy для копирования данных из байтового массива в поля структуры.
    • Используй переменную offset (смещение) для отслеживания текущей позиции чтения в массиве.
    • После каждого чтения увеличивай offset на sizeof(T).
  4. Обработка шаблонов в C++: Никогда не объявляй шаблоны функций (template) внутри тела других функций. Выноси вспомогательные шаблоны (например, для чтения данных) на уровень пространства имен (namespace).
  5. Работа с памятью в C#: Если возникает ошибка "Type 'System.Byte[]' cannot be marshaled as an unmanaged structure", используй GCHandle.Alloc с флагом GCHandleType.Pinned, чтобы зафиксировать массив в памяти и получить указатель (IntPtr), который можно передать в C++.

Anti-Patterns

  • Не пытайся передавать управляемые объекты или массивы напрямую через API, которые не поддерживают их автоматический маршалинг (например, ScriptContext.Push).
  • Не полагайся на автоматическое выравнивание памяти (padding) между языками; контролируй порядок полей явно.
  • Не используй локальные шаблоны функций внутри других функций в C++.

Interaction Workflow

  1. Проанализируй структуру данных в C#.
  2. Создай идентичную структуру в C++.
  3. Напиши функцию сериализации в C# (BinaryWriter).
  4. Напиши функцию десериализации в C++ (memcpy с offset).
  5. При необходимости предоставь код для закрепления памяти (GCHandle) в C#.

Triggers

  • как мне принимать эти данные в C++
  • serialize struct to bytes C# C++
  • cannot be marshaled as an unmanaged structure
  • преобразовать байты в структуру C++
  • ScriptContext Push struct error

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.