- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用现有代码将包含 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/
我的计算机中有一 block 硬件...共享内存。我用返回指向此共享内存的指针的 .dll 调用它。一旦返回指针,旧的 C++ 程序就会写入和读取映射到该指针的结构。 现在我想制作一个新的 C# 程序
有人可以向我解释以下参数异常:结构不能是值类吗?这是由我程序中的以下代码行引起的: Marshal.PtrToStructure(m.LParam, dbh); 假设 dbh 是以下类型: [Stru
谁能看出它失败的原因?如果我用“ref BITMAP lpvObject”替换“out IntPtr lpvObject”,我可以让它以这种方式工作。但我看不出代码有什么问题。 using Syste
在 C++ 中,我有这个: struct BasePacketProto { unsigned short PACKET_OPCODE; unsigned short PACKET_M
我有这个结构: [StructLayout(LayoutKind.Sequential)] public struct IS { public UInt32 ID;
在我的程序 (C#) 中,我使用方法 Marshal.PtrToStructure 将对象转换为在循环中将内存地址添加到结构。在第一个元素,这个工作正常。但是在第二个元素处,发生了访问冲突异常。 ac
我有一个系统,其中远程代理发送序列化结构(来自嵌入式 C 系统)供我通过 IP/UDP 读取和存储。在某些情况下,我需要发回相同的结构类型。我认为我使用 Marshal.PtrToStructure(
在 64 位中运行时,我的单元测试在这段代码上崩溃。 崩溃发生在循环第二次迭代的 Marshal.PtrToStructure 调用上。 “entriesRead”显示为 4,因此它应该能够正确读取,
我正试图对我公司的一堆遗留二进制数据进行逆向工程,以便我可以将其转换为更持久的格式。我们用于创建此数据的应用程序不再受支持。 我发现我可以在一系列结构中描述数据,并且我已经能够使用 Marshal.P
JNA 中 .NET 的 Marshal.PtrToStructure 有什么等价物? 我正在尝试用 Java 编写一个 Firefox 密码解密器,并且正在查看 C# 的等效项,我已经完成了其中的大
我正在尝试将 byte[] 转换为包含数组的结构,该结构包含数组。 像这样: [StructLayout(LayoutKind.Sequential, Pack = 4)] public struct
我通过调用 Marshal.PtrToStructure(intPtr, typeof(Servent)) 得到一个 AccessViolationExcpetion。任何想法我做错了什么?我在 x6
我正在使用 unity3d 开发一个游戏项目。 现在我正在尝试统一将结构从 C++ 传递到 C#。 C++ 中的结构如下所示: #pragma pack(push) #pragma pack(1) c
我正在尝试从键盘 Hook 的 lParam 获取 KBDLLHOOKSTRUCT。 private static IntPtr HookCallback(int nCode, IntPtr
我有这个 C++ 代码: extern "C" __declspec(dllexport) VOID AllocateFoo(MY_DATA_STRUCTURE** foo) { *foo =
我在使用 Marshal.PtrToStructure() 从指向 DEVMODE 类型结构的指针中提取数据时遇到问题。 Here是指向 DEVMODE 结构上的 MSDN 条目的链接。 我对该结构的
我有一个使用 PInvoke 在 C# 和 C++ 之间编码数据的应用程序。该应用程序是一个本地 C++ 应用程序,它在内部使用 C# 部分启动 CLR。 有时我必须将数据从 C++ 编码到 C#
我正在尝试使用现有代码将包含 std::bitsets 的 C++ 结构映射到它的 C# 版本。 我的代码在这些简单的对象上工作得很好: // C++ struct struct log_t {
我们在尝试 PInvoke read() 时遇到奇怪的行为linux/libc 与 Mono 的方法。 [16:05:17.258][UNHANDLED EXCEPTION][BEGIN][16:05
我是一名优秀的程序员,十分优秀!