Marshal.Sizeof() 返回意外值

2024-04-13

我正在调试第三方编写的 C# 代码。该项目是一个旧的 C++ 项目,由承包商用 C# 重写,我无法访问该承包商。我编写了原始的 C++ 版本。

问题在于 C# 代码获取表示通过 UDP 连接接收的数据的结构的大小。

该结构体定义为:

[StructLayout(LayoutKind.Sequential,Pack=1)]
internal class PROXY_HDR {
    public ushort pad;
    public ushort label;
    public char flags;
    public ushort length;
    public char[] ip = new char[4];
    public ushort port;
}

该结构的大小检索如下:

int size = Marshal.Sizeof(typeof(PROXY_HDR));

返回的值是 17 而不是预期的 13。由于有 4 个字节的差异,我怀疑ip成员,但只是因为它的表达方式与其他成员不同(带有“新”),但我没有其他基础来决定。

我通常不会在 C# 代码中使用这种类型的封送处理来毫无问题地解析接收到的数据包,因此我不知道如何修改此结构定义以使其在大小方面与原始版本“对齐”。

我可以用以下内容替换元帅线

int size = 13;

但这是作弊,对吧?

我可以以某种方式修改此布局以使尺寸正确吗?


将其添加到结构中:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal class PROXY_HDR
{
    public ushort pad;
    public ushort label;
    public byte flags;
    public ushort length;
    [MarshalAs(UnmanagedType.ByValArray,
        SizeConst = 4, ArraySubType = UnmanagedType.U1)]
    public byte[] ip;
    public ushort port;
}

这将告诉编译器将其视为典型的 C 风格数组,而不是指针。这should是字节,因为 IP 地址是无符号字符数组。char通常不会在这些类型的标头中使用,它通常byte (i.e: unsigned char)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Marshal.Sizeof() 返回意外值 的相关文章

  • 获取 TextBox 中的文本行数

    我试图通过标签显示文本框中的文本行数 但是 问题是如果最后一行为空 标签必须显示没有空行的行号 例如 如果它们有 5 行 最后一行为空 则标签应将行数显示为 4 Thanks private void txt CurrentVinFilte
  • 使用sqlbulkcopy之前如何创建表

    我有一个 DBF 文件 我正在尝试导入该文件 然后将其写入 SQL 表 我遇到的问题是 如果我使用 SqlBulkCopy 它需要我提前创建表 但在我的场景中这是不可能的 因为 dbf 文件不断变化 到目前为止 这是我的代码 public
  • 如何向WebRequest添加参数?

    我需要从 Web 服务调用一个方法 所以我编写了以下代码 private string urlPath http xxx xxx xxx manager string request urlPath index php org get or
  • 显示 div 内的用户名列表

    我是 jQuery 新手 在我的项目中 我创建了一个类User其中代码如下所示 static ConcurrentDictionary
  • C++ 中的“int”默认是“signed long int”吗?

    Is int默认情况下signed long int in C 它是否依赖于平台和 或编译器 如果是这样 怎么办 EDIT 以下任何一项是否保证是重复的 signed short int signed int signed long int
  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O
  • 如何将 Visual-Studio 2010 切换到 c++11

    我是 c 编程新手 我想尝试 c 11 新功能 那么我要问的是如何切换 Visual studio 2010 才能编译 c 11 源代码 你可以参考这个表 VC10 中的 C 0x 核心语言功能 表格 http blogs msdn com
  • c 使用 lseek 以相反顺序复制文件

    我已经知道如何从一开始就将一个文件复制到另一个文件 但是我如何修改程序以按相反的顺序复制它 源文件应具有读取访问权限 目标文件应具有读写执行权限 我必须使用文件控制库 例如 FILE A File B should be ABCDEF FE
  • AcceptSocket 超时?

    是否有可能AcceptSocket on a TcpListener具有超时的对象 以便它偶尔被中断 TcpListener server new TcpListener localIP port server Start while sh
  • 打开位置设置页面或提示用户启用位置

    我一直在绞尽脑汁 徒劳地谷歌搜索 我正在尝试找到一种方法来提示用户通过直接进入设置页面或仅点击屏幕上的 是 来切换位置 我见过的所有代码似乎都不起作用 有人有有效的方法吗 一个详细的例子将不胜感激 谢谢 我对 Xamarin 开发非常陌生
  • PartialView Action 正在调用自身

    我有 MVC 应用程序 它用于从主视图 ProductMaster 将 ProductAreaGrid 列表显示为 PartialView 并且它将在局部视图内将 CreateProductArea 作为 PartialView 我的 Gr
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • 根据 Active Directory 策略检查密码[重复]

    这个问题在这里已经有答案了 我有一个允许用户更改其 AD 密码的前端 有没有办法获取特定用户及其属性 长度 复杂性 的密码策略 例如细粒度 有没有办法根据此特定策略检查字符串 xyz121 编辑 我不想检查活动目录中存储的当前密码 我想检查
  • Web 文本编辑器中的 RTF 格式

    网络上是否有支持 RTF 格式文档输入的文本编辑器 我知道这对 webdev 来说有点奇怪 但我需要从数据库中读取 RTF 文档 并在基于 Web 的文本编辑器中对其进行编辑 然后将其存储回 RTF 中 在我在转换工具上投入太多资金之前 我
  • 使用联合对 IP 地址进行多种解释?

    在工作中 我们使用以下构造来将 IP 地址解释为 4 字节数组或 32 位整数 union IPv4 std uint32 t ip std uint8 t data 4 这很好用 但是读完这本书的第 97 章 不要使用联合来重新解释表示
  • 如何在 ASP.NET Core 项目中使用 MStest 测试 Ok() 结果

    我正在使用 MStest 来测试我的控制器 我想测试这个动作 HttpGet Name GetGroups public async Task
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • 模板定义中的友元函数

    我的问题有点相关this https stackoverflow com questions 1297609 overloading friend operator for template class one 我想重载某些类的运算符 te
  • 按 Enter 继续

    这不起作用 string temp cout lt lt Press Enter to Continue cin gt gt temp cout lt lt Press Enter to Continue cin ignore 或更好 in

随机推荐

  • 包裹元素然后在其中附加另一个元素

    看这段代码 div class preview img src link alt class overlay div 我需要做的是将内部 div 调用 overlay 然后附加另一个名为 overlay2 的 div 如下所示 div cl
  • Rails:将可选参数组合到查询中

    我有一个包含需要过滤的巨大分页记录列表的视图 用户可以通过几种不同的方式按记录进行过滤 例如 已保存 记录 读取 记录和 标记已删除 记录 我希望他们能够combine这些过滤器以任何可能的方式 我目前的 有缺陷的 不起作用的方法 除非所有
  • 避免使用实体类内的方法定义进行查询时出现查询客户端评估错误

    In a NET核心2 1项目中 我使用 EF Core 和命令模式 使用MediatRSQL Server 数据库上的库 我通过使用以下设置来设置项目以避免客户端查询评估 var phaseOptions new DbContextOpt
  • iPhone 视频缓冲区

    我正在尝试在不越狱 iPhone 的情况下构建一个录像机 我有开发人员许可证 我开始使用PhotoLibrary私有框架 但我只能达到2ftp 太慢 Cycoder 应用程序的 fps 为 15 我认为它使用了不同的方法 我尝试从 Came
  • 尝试在节点集群后面扩展时 phantomjs-node 崩溃

    相关 GitHub 问题 https github com sgentle phantomjs node issues 280 https github com sgentle phantomjs node issues 280 我有一个简
  • `tf.multiply` 和 `*` 有什么区别?

    After import tensorflow kera backend as K 有什么区别tf multiply and 同样 有什么区别K pow x 1 and 1 x 我根据其他一些代码编写了以下自定义指标函数的代码 def di
  • SQL Server 2005:SQL Server 身份验证有多安全?

    如果您使用 SQL Server 身份验证 2005 登录详细信息是否以明文形式通过网络发送 如您所愿 确保安全 您可以相当轻松地配置 SSL 如果您没有受信任的证书 如果您强制加密 SQL Server 可以创建 颁发它自己的自签名证书供
  • 如果我想将单个可变对象传递给函数的多个参数,我该怎么办?

    我用 Rust 编写了一个程序 使用步进电机播放音乐 现在我想添加一些假对象 以便我可以进行自动化测试 但是 我不知道有什么好方法来定义这些假对象 以便我的程序可以实际使用它们 You can 有效的部分 该程序的主循环使用两个特征对象 一
  • 将整数对象的 ArrayList 转换为 int 数组? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将包含 Integers 的 ArrayList 转换为原始 int 数组 https stackoverflow com questions 718554 how to convert an a
  • 当手机处于静音模式时,在后台应用程序上播放声音

    我已经构建了一个计时器应用程序 我遇到的一个问题是当它处于后台时 如果用户关闭音量 我无法敲响计时器 关闭音量或声音也会使通知静音 这是我在后台敲响计时器的方法 我刚买了一块瓷砖 发现了它即使在静音状态下也可以让您的手机响铃 https s
  • 使用 JavaScript 关闭移动浏览器选项卡

    我需要一个本机应用程序来启动带有某些 URL 的浏览器 将用户带到移动网站 在移动网站内部 必须有一个按钮可以关闭浏览器 或向本机应用程序发送任何信号 以便用户返回到本机应用程序 目前我正在尝试关闭窗口 但我认为这不会在所有移动设备上起作用
  • 类型错误:validate_on_submit() 缺少 1 个必需的位置参数:'self'

    我正在使用Flask 网络开发 http shop oreilly com product 0636920031116 do教程和我已经遇到并且正在遇到几个错误 我的简单网络应用程序正在利用 FlaskForm 并尝试验证信息 但遇到了一些
  • 通过 PHP 将 MySQL 转换为 XML

    我的服务器上有一个 MySQL 数据库 我希望通过 PHP 以 XML 形式返回某个表 我见过各种将 XML 传输到 MySQL 的方法 但并不是一种容易遵循的相反方法 我应该怎样做呢 只需提取数据并手动将其形成 XML 文档 使用 DOM
  • 什么是http请求期间的连接超时

    我找到了关于 连接超时 的两种解释 当客户端在 timeout 秒内未向服务器发送任何字节时 服务器将关闭套接字连接 它似乎与 HTTP 标头有一些关系 Connection keep alive 如果在此期间未建立套接字连接 则客户端将在
  • 按比例填充 UIStackView

    我正在使用 Storyboard 创建一个由 UITableView 和底部的 UIView 组成的布局 我正在使用 UIStackView 并垂直播放它们 我希望 UITableView 占据高度的 80 UIView 页脚 占据 20
  • Haskell - 需要为类型类定义 Vector2 实例

    newtype Vector2 a Vector2 a a deriving Show Eq class VectorSpace v where vZero Num a gt v a vSum Num a gt v a gt v a gt
  • 在maven中配置不同文件类型的编码?

    我用maven 资源插件 http maven apache org plugins maven resources plugin faq html过滤我的 Maven 项目中的一些资源 在我的父项目中 我有
  • 强制 applicationCache 重新加载缓存文件

    我使用 HTML5 applicationCache 来存储页面的许多 Javascript CSS 图像等文件 如果我更新其中一个文件 浏览器永远不会重新加载它 我已经尝试过以下方法 在页面加载时调用 applicationCache u
  • 如何从vue3中的“setup”方法中“发出”事件?

    我知道我可以打电话给emit方法从setup方法 但是有没有办法从任何其他函数发出事件而不传递emit设置方法中的方法 不是中的功能 methods选项 但是一个useXXX功能 setup函数有两个参数 第一个是props 第二个是con
  • Marshal.Sizeof() 返回意外值

    我正在调试第三方编写的 C 代码 该项目是一个旧的 C 项目 由承包商用 C 重写 我无法访问该承包商 我编写了原始的 C 版本 问题在于 C 代码获取表示通过 UDP 连接接收的数据的结构的大小 该结构体定义为 StructLayout