C# 从 byte[] 转换为 struct。字节顺序错误

2023-12-03

我试图在实现基于 UDP 的协议时使用结构来解析套接字数据。 我搜索了一下,可以使用这两个函数在 byte[] 和 struct 之间进行转换:

 byte[] StructToBytes(object structObj)
    {
        int size = Marshal.SizeOf(structObj);
        IntPtr buffer = Marshal.AllocHGlobal(size);
        try
        {
            Marshal.StructureToPtr(structObj, buffer, false);
            byte[] bytes = new byte[size];
            Marshal.Copy(buffer, bytes, 0, size);
            return bytes;
        }
        finally
        {
            Marshal.FreeHGlobal(buffer);
        }

    }

    static object BytesToStruct(byte[] bytes, Type strcutType, int offset = 0)
    {
        int size = Marshal.SizeOf(strcutType);
        IntPtr buffer = Marshal.AllocHGlobal(size);
        try
        {
            Marshal.Copy(bytes, offset, buffer, size);
            return Marshal.PtrToStructure(buffer, strcutType);
        }
        finally
        {
            Marshal.FreeHGlobal(buffer);
        }
    }

然后我遇到了这个问题:

//I defined a simple struct with an ushort member
    [StructLayout(LayoutKind.Sequential, Pack = 2)]
    struct S
    {
        public ushort a;
    }

    //Then I define a byte[]
    byte[] bArr;
    bArr[0] = 0;
    bArr[1] = 1;

    //Convert to struct
    S s = (S)BytesToStruct(bArr, typeof(S));
    //Then s.a = 0x0100 not 0x0001

struct 到 byte[] 也是一样的。 ushort 的 2 个字节被反转。 我该如何解决这个问题?


如今,大多数处理器都使用 Little-Endian 字节排序(最低有效字节在前)。网络字节顺序是传统的 Big-Endian,因此您通常需要镜像字节顺序。您可以使用以下命令检查系统的字节顺序System.BitConverter.IsLittleEndian

弗兰克提到的 ntohs() 的 .Net 等价物位于(奇怪的是)System.Net.IPAddress.NetworkToHostOrder()

您还可以编写自己的机制,使用位移位和逻辑或来直接按正确的顺序读取字节。

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

C# 从 byte[] 转换为 struct。字节顺序错误 的相关文章

  • C# 打印问题(RichTextBox)

    我想打印我的 RichTextBox eintragRichTextBox 的内容 我现在有这个代码 private void druckenPictureBox Click object sender EventArgs e PrintD
  • json.net自定义jobject反序列化

    我正在尝试使用 JsonConvert DeserializeObject string 将字符串反序列化为可与动态一起使用的 jobject 来动态访问 json 文档 但是我想避免知道文档的大小写 以便我可以输入 dynamic doc
  • 将 new 与 decltype 一起使用

    T t T is an implementation detail t new T want to avoid naming T to allow for flexibility t new decltype t error cannot
  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 将完整模板参数值映射到原始类型

    我想将数字映射到类型 在这个例子中 我将创建一个函数 将 sizeof 结果映射到有符号的原始类型 我想知道是否有更好的方法来完成我在现代 C 中所做的事情 即采用模板化值并将其转换为类型 现在 这可以将大小转换为已知类型 但我似乎无法在标
  • 在开关中使用“goto”?

    我看到了一个建议的编码标准 内容如下Never use goto unless in a switch statement fall through 我不跟 这个 例外 案例到底是什么样的 这证明了goto 此构造在 C 中是非法的 swi
  • 增强精神、递归和堆栈溢出

    为什么下面的代码在运行时崩溃 它会给出堆栈溢出错误 include
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 为什么 Cdecl 调用在“标准”P/Invoke 约定中经常不匹配?

    我正在开发一个相当大的代码库 其中 C 功能是从 C P Invoked 的 我们的代码库中有很多调用 例如 C extern C int stdcall InvokedFunction int 使用相应的 C DllImport CPlu
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 使用 jQuery 从 ASP.Net JSON 服务获取数据

    我正在尝试调用 Google 地图地理编码 API 从纬度 经度对中获取格式化的地址 然后将其记录到控制台 我正在尝试获取为给定位置返回的第一个 formatted address 项目 我很简单无法从 JSON 中提取该项目 我不知道为什
  • 如何在 winforms 应用程序的主屏幕显示之前显示欢迎屏幕?

    我想在应用程序启动时加载欢迎屏幕 然后用户单击欢迎屏幕上的按钮 然后关闭欢迎屏幕 最后显示主屏幕 static void Main startup method being called Application EnableVisualSt
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • INotifyPropertyChanged 和 propertyName

    我一直不确定它的含义propertyName实施时INotifyPropertyChanged 所以一般来说你实现INotifyPropertyChanged as public class Data INotifyPropertyChan
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl

随机推荐

  • Java-切换字符串中的字母大小写

    我有我的代码可以将大小写从上切换到下 反之亦然 我也有它可以从上到下 从下到上切换的位置 我的问题是 有没有办法让它也包含逗号或句点等字符 例如 如果我输入字符串 Hello there 我会得到 你好 那里 你好 那里 和 你好 我怎样才
  • Unity Hololens2 构建错误

    我尝试构建 Hololens 2 应用程序 但遇到无法解决的错误 当我尝试使用 Unity 播放按钮测试应用程序时 它按预期工作 我还尝试了 MRTK 示例场景 它也只能通过播放按钮起作用 但当我尝试构建它时却不起作用 构建错误 Libra
  • 熊猫在索引列上合并? [复制]

    这个问题在这里已经有答案了 In 88 c Out 88 Address Name CustomerID 10 Address for Mike Mike 11 Address for Marcia Marcia In 89 c index
  • 为 javafx textField 添加最多 2 位小数的侦听器

    我想将 javaFX 文本字段设置为小数点后两位 我找到了答案 但它是针对数值的 例如 force the field to be numeric only textField textProperty addListener new Ch
  • 如何更改 UIImagePickerController 中的取消按钮标题?

    目前我正在开发一个多语言应用程序 我想更改Cancel Use and Retake的按钮标题UIImagePickerController 我怎样才能做到这一点 我的问题是通过使用自定义覆盖类解决的 self picker UIImage
  • 如何用日期标记 x 轴?

    我似乎无法弄清楚如何在 Matlab 中绘制不按数字顺序排列的日期 我需要的日期是从 1 月 22 日到 2 月 1 日 但是当我将其放入 Matlab 中时 它从 1 日开始按数字顺序排列 所以我想知道如何获取它 以便它按照我的列表顺序排
  • Google Cast SDK3 Android 示例应用程序在低于 5.0 的设备上崩溃

    我已经尝试过 Google Cast Android 示例应用程序 但对于低于 5 0 的设备会崩溃 有人知道为什么吗 下面是我的崩溃日志 0830 12 38 57 242 E AndroidRuntime 16269 引起 java l
  • 如何从极坐标中的日期时间列中提取日期

    我正在尝试从熊猫转移到极地 但遇到了以下问题 import polars as pl df pl DataFrame integer 1 2 3 date 2010 01 31T23 00 00 00 00 2010 02 01T00 00
  • 批量更改文件扩展名

    简单的问题 IMDU 命令执行 imdu b file imd file raw 并将 file imd 转换为 file raw 我有很多 imd 所以我需要一批 我努力了 for x in imd do imdu b x nx raw
  • jQuery:包含用于搜索多个字符串的选择器

    假设我有 li Mary li li John Mary Dave li li John Dave Mary li li John li 如果我需要找到所有包含 John 和 Mary 的 元素 我将如何构建 jQuery 搜索单个字符串似
  • 在 R 中将 raw 转换为 long?

    我需要读取一个编码长整型的二进制文件 我只举其中一个多头作为例子 don t know a simpler way to create the raw vector z lt writeBin c 8L 208L 59L 233L 106L
  • PHP签入签出系统

    我有 PHP 的基本知识 我正在尝试通过向数据库添加签入时间和签出时间来创建签入和签出系统 报到 session start SESSION inchecken true tijd date H i s query INSERT INTO
  • 使用 R/Selenium 仅查找 Disqus 中最热门的帖子

    首先 我对这篇文章的长度表示歉意 因为我想提供足够的细节来说明我正在尝试做的事情 我正在尝试完善我用 R 编写的抓取应用程序以获取 Disqus 评论 到目前为止 我可以使用各种 RSelenium 功能获取特定页面上的所有评论 我现在想做
  • C# 面板作为 MDI 容器

    在 C 中 我想创建一个具有 MDI 容器属性的面板 即 isMdiContainer true 我尝试过这样的事情 form MDIParent this panel1 但这不起作用 有什么建议么 可以创建一个 MDI 面板并在该面板中显
  • 如何在 android 中的 glSurfaceView 之上构建 GUI/HUD

    我有一个glSurfaceView看起来像这样 public class GLLayer extends GLSurfaceView implements SurfaceHolder Callback Camera PreviewCallb
  • IE 条件注释与 Sass 和 Bourbon

    我想为不同的浏览器提供不同的字体 请参阅这个问题 有没有一种巧妙的方法可以用 Sass Bourbon 来做到这一点 这是我到目前为止所拥有的 include font face myicons myicons weight normal
  • 区分 NTAG213 和 MF0ICU2

    有没有什么方法可以区分NTAG213 from a MF0ICU2基于 UID ATQA 或 SAK 值的标签 由于我必须对标签进行不同的编程 NTAG213 的 PWD PACK 或 MF0ICU2 的 3DES 因此必须有一种方法来调用
  • Redux 中连接的组件未接收存储属性

    我正在进行一些重构 并尝试使用以下命令将更高级别的组件连接到 reduxconnect 但我正在连接的组件一直给我空的道具 我已经包含了相关的代码 我已经将我的 redux 减速器构造成ducks格式 因此操作 创建者和缩减者位于一个模块文
  • Android Microsoft Office 库(.doc、.docx、.xls、.ppt 等)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有谁知道有一个好的 Java Microsoft Office API 能够在 Android 上运行吗 我知道有一个 OpenOffice Jav
  • C# 从 byte[] 转换为 struct。字节顺序错误

    我试图在实现基于 UDP 的协议时使用结构来解析套接字数据 我搜索了一下 可以使用这两个函数在 byte 和 struct 之间进行转换 byte StructToBytes object structObj int size Marsha