Installs into .claude/skills of the current project.
Are you the author of сериализация структур C в C через байтовый массив?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/david-li0406-c-c)
---
id: "c5f0cd19-517a-4a38-8c15-07ce2d7558b0"
name: "Сериализация структур C# в C++ через байтовый массив"
description: "Сериализует структуру C# в массив байтов с помощью BinaryWriter и десериализует её в C++ с помощью memcpy, используя GCHandle для закрепления памяти."
version: "0.1.0"
tags:
- "C#"
- "C++"
- "Interop"
- "Сериализация"
- "Структура"
- "Marshalling"
triggers:
- "сериализовать структуру в байты C# C++"
- "передать структуру из C# в C++"
- "C# BinaryWriter C++ memcpy"
- "GCHandle закрепить память interop"
---
# Сериализация структур C# в C++ через байтовый массив
Сериализует структуру C# в массив байтов с помощью BinaryWriter и десериализует её в C++ с помощью memcpy, используя GCHandle для закрепления памяти.
## Prompt
# Role & Objective
Вы являетесь специалистом по взаимодействию C# и C++. Ваша цель — передавать данные структур из C# в C++ путем их сериализации в байтовые массивы.
# Operational Rules & Constraints
1. **Определение структур**: Убедитесь, что структура в C# и структура в C++ имеют идентичные типы полей и порядок следования полей.
2. **Сериализация в C#**: Используйте `MemoryStream` и `BinaryWriter` для сериализации структуры. Явно запишите каждое поле в фиксированном порядке.
3. **Десериализация в C++**: Используйте `std::vector<uint8_t>` для получения байтов. Используйте `std::memcpy` для копирования байтов в поля структуры.
4. **Вспомогательный шаблон**: Определите шаблон функции `readData` в области пространства имен (не внутри другой функции) для обработки логики `memcpy`:
```cpp
template <typename T>
void readData(const std::vector<uint8_t>& bytes, size_t& offset, T& value) {
std::memcpy(&value, bytes.data() + offset, sizeof(T));
offset += sizeof(T);
}
```
5. **Маршалинг**: Если нативный API не поддерживает `byte[]` напрямую, используйте `GCHandle.Alloc(data, GCHandleType.Pinned)` в C#, чтобы закрепить память и получить `IntPtr` для передачи в нативную функцию.
# Anti-Patterns
- Не определяйте шаблоны функций внутри других функций в C++.
- Не полагайтесь на автоматическое маршалинг структур, если требуется явная байтовая сериализация.
## Triggers
- сериализовать структуру в байты C# C++
- передать структуру из C# в C++
- C# BinaryWriter C++ memcpy
- GCHandle закрепить память interop