问题标签 [structlayout]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2254 浏览

c# - c# 中的联合与 StructLayout

我有多个结构都以标头结构开头。像这样

标题是

现在的问题是我需要将它们与 Byte[] 联合起来。我用这个试过了

当我用数据填充缓冲区时,我无法从标题中获取数据。如何使 c# 与 c++ 中的 union 一样?

0 投票
4 回答
2861 浏览

c# - StructLayout 将字节数组转换为short

对不起这个可怕的标题,但老实说我知道我想要什么,也知道什么是错的......

基本上我有一个结构(我有 250 多个结构,但它们都遵循相同的想法),如下所示:

问题是字节数​​组是引用类型,而short是值类型,它不允许将fieldoffset设置为相同的内存位置......

我真的很讨厌不得不删除我写的所有结构,只是为了换一种方式。所以这是我的问题,我怎样才能以一种有效的方式使用它。基本上我要做的是:

它甚至拒绝编译,因为它不想生成结构 /:

在有人提出其他方法之前,我这样做的原因是它需要超高速......我可以使用 ByteReader 和其他方法(例如 BitConverter),但它需要比这快一点......

我从按位移位开始,但我需要一种更“动态”的方式来做到这一点,因为在获得数据包 ID 后,我会使用另一个结构来读取它,例如:

而不是必须有很多内联的“按位狗屎”,我只是想要一种简单且非常快速的方法来做到这一点......似乎我得到了快速而不是简单/:

请帮忙!不安全的代码是可以的,但也更喜欢托管版本。

FAIL :(:只记得你可以通过装箱将值类型转换为引用类型(强制转换为类型对象)。但这确实删除了 REAL 返回类型并说它只是一个对象,无论如何 XML 文档都可以说谎关于返回类型? 悲伤地不起作用 D:

更新:好的,现在我有:

但是每次都必须调用一个方法来转换它有点烦人:(有人有更多建议吗?

谢谢,JD

0 投票
2 回答
435 浏览

c# - PInvoke 用于 DWORD 对齐的内存句柄

我试图为MSDNACCESS_DENIED_ACE中定义的 struct编写 C# 等效项:

SidStart受托人 SID 的第一个 DWORD在哪里。SID 的剩余字节存储在 SidStart 成员之后的连续内存中。

我已经看到了使用它的例子(PSID) &accessAllowedAce->SidStart

现在我StructLayout该如何为此编写 C# 以及如何在EqualSid函数中使用它,同时解释您的解决方案是如何工作的。

0 投票
1 回答
948 浏览

.net - 使用隐式构造函数将 StructLayout 属性添加到 F# 类型

我有:

但出现错误:只有没有隐式构造函数的结构和类才能被赋予“StructLayout”属性

所以我意识到它必须是相似的:

但是这样我就失去了我的界面。例如,在 C# 中,type:StructLayout可以为这种类型的类添加(我认为)。我必须如何重构我的代码以避免此错误?

0 投票
2 回答
681 浏览

c# - 从 p/invoke 修改结构布局

我正在寻找有关更改返回/传递到 ap/invoke 函数的对象的结构/类布局的最佳实践指南。我一直在寻找这个问题的答案,但也许我太累了,我没有有效地寻找。

我能想到的最简单的例子(真正的例子在这里有点太复杂了)是像GetWindowRect这样的东西。

如果我想为 RECT 结构添加一些额外的属性,我应该将它添加到结构本身的定义中,还是应该切换到子类化以添加额外的属性?

Microsoft 或其他可靠来源围绕以下方法是否有最佳实践?这两者都违反最佳实践吗?

相对

0 投票
1 回答
2370 浏览

c# - 子结构具有 LayoutKind.Explicit 时不遵循 LayoutKind.Sequential

运行此代码时:

我希望在 x86 和 x64 上都有这个输出:
4 或 8(取决于 x86 或 x64)

2
3
1
6
0
4
5
垃圾

我在 x86 上得到的是:
4

6
0
2
3
1
4
5
垃圾

我在 x64 上得到的是:
8

6
0
2
3
1
0
4
5

更多:
- 当我删除 LayoutKind.Explicit 和 FieldOffset 属性时,问题就消失了。
- 当我删除 Bool 字段时,问题就消失了。
- 当我删除长字段时,问题就消失了。
- 请注意,在 x64 上似乎 Pack=4 属性参数也被忽略了?

这适用于 .Net3.5 和 .Net4.0

我的问题:我错过了什么?或者这是一个错误?
我发现了一个类似的问题:
如果结构包含 DateTime 字段,为什么 LayoutKind.Sequential 的工作方式会有所不同?
但在我的情况下,即使子结构的属性发生变化,布局也会发生变化,而数据类型没有任何变化。所以它看起来不像是优化。除此之外,我想指出,另一个问题仍未得到解答。
在另一个问题中,他们提到使用编组时尊重布局。我自己还没有测试过,但我想知道为什么布局不尊重不安全代码,因为所有相关属性似乎都已经到位?文档是否在某处提到除非完成编组,否则这些属性将被忽略?为什么?
考虑到这一点,我什至可以期望 LayoutKind.Explicit 能够可靠地处理不安全的代码吗?
此外,文档提到了保持结构与预期布局的动机:

为了减少与 Auto 值相关的布局相关问题,C#、Visual Basic 和 C++ 编译器为值类型指定了顺序布局。


但是这个动机显然不适用于不安全的代码?

0 投票
2 回答
544 浏览

c# - Arrays sharing memory in .NET4.0 - is that possible with reflection or StructLayout?

I have huge transient arrays created rapidly. Some are kept, some are GC-d. This defragments the heap and the app consumes approx. 2.5x more memory than it would truly need resulting OutOfMemoryException.

As a solution, I would prefer to have one gigantic array (PointF[]) and do the allocation and management of segments by myself. But I wonder how I could make two (or more) arrays share the same memory space.

I am thinking of a trick like the winner answer of this SO question. Would that be possible? The problem is that the length and the number of the segment arrays are known only in runtime.

0 投票
1 回答
622 浏览

c# - C# pack 1 StructLayout 网络

我正在尝试将缓冲区从服务器发送到我自己制作的客户端。它适用于 TCP 上的套接字。

我有一个需要发送的结构:

我得到了这些函数来从字节数组转换为结构体,从结构体转换为字节数组:

在客户端中,我收到缓冲区,但是当客户端尝试使用 ByteArrayToStruct 函数时,出现运行时错误。

0 投票
1 回答
1198 浏览

c# - 为什么 System.DateTime 结构的布局类型为 Auto?

该结构System.DateTime及其表亲System.DateTimeOffset将其结构布局类型设置为“自动”。这可以通过以下方式看到:

或者:

或者可以从声明的 IL 中看出:

通常,用 C# 编写的结构(即不是枚举的 .NET 值类型)将具有“顺序”布局(除非StructLayoutAttribute已应用 a 来指定另一个布局)。

我搜索了一些常见的BCL程序集,DateTime并且DateTimeOffset是我在此布局中发现的唯一公开可见的结构。

有谁知道为什么DateTime会有这种不寻常的结构布局?

0 投票
0 回答
746 浏览

c# - C# StructLayout Pack 获取 System.NullReferenceException,对齐问题?

首先,我要说的是,我没有被卡住,因为我有很多解决方法!最好的一点是我不再需要 1Byte Pack 了:P

但老实说,我对这种行为感到很困惑。我正在使用 Unity,它在 Windows 上完美运行,但在 Android(单声道)上失败

  • 我写了什么无效的东西吗?
  • 我是否在 Mono 上出现了错误?!

评论绝对欢迎!

一些额外的信息/线索:

  • Android/Windows 之间的差异可能来自处理器架构差异 Android ARM(RISC),假设 4Bytes alignement (或至少 2Bytes in thumb mode)

  • [StructLayout(LayoutKind.Sequential, Pack = 1)] 似乎影响的不仅仅是结构。

内存对齐可能变成:

我期待更多这样的东西: