gpt4 book ai didi

c# - 在包含两个位集的 C++ 结构上使用 C# 的 Marshal.PtrToStructure

转载 作者:行者123 更新时间:2023-11-28 04:28:04 28 4
gpt4 key购买 nike

我正在尝试使用现有代码将包含 std::bitsets 的 C++ 结构映射到它的 C# 版本。

我的代码在这些简单的对象上工作得很好:

// C++ struct
struct log_t
{
uint16 current;
bool complete[64];
};

C# struct
[StructLayout(LayoutKind.Sequential)]
public struct Log
{
public UInt16 current;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64, ArraySubType = UnmanagedType.Struct)]
public byte[] complete;
}

// Convert the C# struct back to bytes for the C++ app to use
private byte[] GetObjectBytes(object obj)
{
int size = Marshal.SizeOf(obj);
byte[] arr = new byte[size];
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(obj, ptr, true);
Marshal.Copy(ptr, arr, 0, size);
Marshal.FreeHGlobal(ptr);
return arr;
}

如何将以下 C++ 结构映射到包含两个 std::bitset 的 C# 结构?我希望以与上述相同的方式使用它们。

struct items_table
{
std::bitset<512> keyList;
std::bitset<512> seenList;
};

struct items
{
std::array<items_table, 7> tables;
};

解决方案

我在 C# 中使用 byte[] 数组来表示 C++ 中的位集。然后我必须像这样访问每一位:

    private void AddItem(int ItemId, KeyItems keyitems)
{
decimal byteIndex = (ItemId % 512) / 8;
decimal bitInByteIndex = (ItemId % 512) % 8;
keyitems.tables[ItemId / 512].keyList[(int)byteIndex] |= (byte)(1 << (byte)bitInByteIndex);
}

最佳答案

我们在工作中经常使用互操作,虽然我不必处理这种情况,但我建议您将位集视为字节数组(C# 中的 byte[],我相信 C++ 中的 char[],除非您重新别名 char )。毕竟 512 位只是 64 个连续字节。

我承认我没有给你完整的语法解释,我很抱歉,但我希望这能让你指明正确的方向。

如果您的 C# 端需要将它们用作 BitArray实例,您可以在您的结构上创建属性,然后根据您的 byte[] 计算它们秒。这对互操作没有坏处;编码器不会尝试在任一方向上跨代码边界转换它们。

关于c# - 在包含两个位集的 C++ 结构上使用 C# 的 Marshal.PtrToStructure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53750602/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com