将字节数组转换为对象

2023-12-26

C# 有没有办法将纯字节数组转换为对象?

例如给定这个类:

class Data
{
    public int _int1;
    public int _int2;
    public short _short1;
    public long _long1;
}

我希望基本上能够做这样的事情:

var bytes = new byte[] { 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0 };
var obj = (Data)bytes;

您可以尝试编组:

将类的布局声明为顺序(并注意,您将需要使用Pack = 1):

[StructLayout(LayoutKind.Sequential, Pack = 1)]
class Data
{
    public int _int1;
    public int _int2;
    public short _short1;
    public long _long1;
}

将字节编组到 Data 类的新实例中:

var bytes = new byte[] { 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0 };
GCHandle gcHandle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
var data = (Data)Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject(), typeof(Data));
gcHandle.Free();

// Now data should contain the correct values.

Console.WriteLine(data._int1);    // Prints 1
Console.WriteLine(data._int2);    // Prints 2
Console.WriteLine(data._short1);  // Prints 3
Console.WriteLine(data._long1);   // Prints 4

为了方便起见,您可以在 Data 上编写一个静态方法来进行转换:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
class Data
{
    public int _int1;
    public int _int2;
    public short _short1;
    public long _long1;

    public static Data FromBytes(byte[] bytes)
    {
        GCHandle gcHandle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
        var data = (Data)Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject(), typeof(Data));
        gcHandle.Free();
        return data;
    }
}

...

var data = Data.FromBytes(new byte[] {1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0});

如果您确实愿意,可以编写一个显式运算符来从字节数组进行转换,以获取 OP 中的语法。我建议只使用Data.FromBytes()在我看来,这会更加清晰。

不过,为了完整性:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
class Data
{
    public int _int1;
    public int _int2;
    public short _short1;
    public long _long1;

    public static explicit operator Data(byte[] bytes)
    { 
        GCHandle gcHandle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
        var data = (Data)Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject(), typeof(Data));
        gcHandle.Free();
        return data;
    }
}

...

var data = (Data)new byte[] {1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将字节数组转换为对象 的相关文章

  • 我应该把 try/catch 和“using”语句放在哪里? [复制]

    这个问题在这里已经有答案了 可能的重复 try catch using 正确的语法 https stackoverflow com questions 4590490 try catch using right syntax 我想try c
  • 是否可以从 C++ 应用程序调用 C# 应用程序?

    我是一名编程学生 现在我已经上了两门 C 课程 这个学期我将参加我的第一门 C 课程 出于好奇 是否可以从 C 应用程序调用 C 应用程序 如果是的话 是否还可以检查运行该程序的计算机是否具有 NET框架 我只是很好奇 我想如果可能的话 这
  • 无法将 std::min 传递给函数,std::min 的副本有效

    Passing std min函数无法编译 我复制了 libcpp 声明std min进入我的源文件并且它可以工作 std 版本有什么问题 clang 和 gcc 也会发生同样的情况 在 Godbolt 上测试 https godbolt
  • 锁定 ASP.NET 应用程序变量

    我在 ASP NET 应用程序中使用第三方 Web 服务 对第 3 方 Web 服务的调用必须同步 但 ASP NET 显然是多线程的 并且可能会发出多个页面请求 从而导致对第 3 方 Web 服务的同时调用 对 Web 服务的调用封装在自
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • 将下拉列表与字典绑定

    我将字典绑定到下拉列表 举例来说 我的字典中有以下项目 Test1 123 Test2 321 我希望下拉文本采用以下格式 Test1 Count 123 Test2 Count 321 我沿着以下路径走 但没有运气 MyDropDown
  • C# 编译器数字文字

    有谁知道 C 编译器数字文字修饰符的完整列表 默认情况下 声明 0 使其成为 Int32 声明 0 0 使其成为 Double 我可以在末尾使用文字修饰符 f 来确保某些内容被视为 Single 例如像这样 var x 0 x is Int
  • 在 C++11 中移出 stdpriority_queue 的元素

    最小的工作示例 include
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • Xamarin - SignalR 挂在连接上

    我正在尝试将我的 Xamarin 应用程序连接到托管在 Azure 上的 SignalR 后端 我遇到的问题是每次我在 HubConnection 上调用 StartAsync 时 它都会挂起客户端并且请求永远不会完成 我尝试通过应用程序进
  • 无法为 wsdl 文件创建服务引用

    I have wsdl文件和xsd我本地机器上的文件 我想在项目中添加服务引用 我没有网络服务 我只有wsdl file 我收到以下错误 The document was understood but it could not be pro
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • 如何在dll级别读取app.config? [复制]

    这个问题在这里已经有答案了 我在一个解决方案中有一个控制台应用程序项目和库项目 dll The 图书馆项目有 app config 文件 我在其中存储我在库中使用的一些键值对 控制台应用程序引用此 dll 我有另一个 app config
  • Autoconf 问题:“错误:C 编译器无法创建可执行文件”

    我正在尝试使用 GNU 自动工具构建一个用 C 编写的程序 但显然我设置错误 因为当configure运行 它吐出 configure error C compiler cannot create executables 如果我看进去con
  • 在哪里可以下载没有 Visual Studio 2010 的 C# 4.0 编译器?

    我知道 CTP VS 2010 映像 但我可以只下载 NET Framework 4 0 和 C 编译器吗 AFAIK VS 2010 CTP 仅作为 VM 映像提供 我不相信 Microsoft 发布了 VS 的安装程序 其中一个绝对不适
  • C 语言中的 Alpha 混合 2 RGBA 颜色[重复]

    这个问题在这里已经有答案了 可能的重复 如何快速进行阿尔法混合 https stackoverflow com questions 1102692 how to do alpha blend fast 对 2 个 RGBA 整数 颜色进行
  • 无法识别解决方案文件夹中的 Visual Studio 2017 Nuget.config

    我在使用 Visual Studio 2017 时遇到问题 新的解决方案不断引用 C Users yopa AppData Roaming NuGet Nuget config 中意外位置的 Nuget config 文件 我已将 nuge
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima

随机推荐

  • MVC 3 安装 MVC4 后停止工作 [重复]

    这个问题在这里已经有答案了 可能的重复 MVC 4 Beta 并排安装错误 https stackoverflow com questions 9471263 mvc 4 beta side by side installation err
  • 如何将 Universal Analytics 集成到 Chrome 扩展程序中?

    Chrome 扩展指南有一个旧的分析安装教程 https developer chrome com extensions tut analytics html https developer chrome com extensions tu
  • 如何在 React Native 中截屏测试?

    我想使用屏幕截图测试我的 React Native 应用程序 UIAutomation javascript 文件将由以下命令执行fastlane https fastlane tools 并且应该向我提供我需要的所有子视图 这部分工作正常
  • IL/CLR/DLR 参考资料?

    我想了解更多有关 IL 和 CLR DLR 的幕后信息 我的一个朋友推荐了 Inside Microsoft NET IL Assembler 这本书 但自从它于 2002 年出版以来 我担心它现在已经过时了 有没有人有更多最新的书籍或网站
  • 如何使用 itertools 模块获取排序列表中下一个按字典顺序更大的字符串?

    我需要输入一个字符串 并返回其下一个字典顺序更大的字符串 例如 anmdfg 的下一个字符串是 anmdgf 但是 输入的长度可能非常大 它可能包含100个字符或更多 而且里面会有一些重复的字符 所以我决定使用 itertools perm
  • AsyncTask 中的 ArrayAdapter 错误

    我有以下代码 但在 userSpinner setAdapter adapter 这一行出现错误 private class Task extends AsyncTask
  • 如何使用 Python 检索 AWS Lambda 公共 IP 地址?

    我的应用程序是使用链接 url 来调用lambda函数 然后我想知道lambda的公共IP并获取页面源 如何使用 python 获取 lambda 公共 IP 多谢 你可以卷曲到checkip amazonaws com获取公共IP imp
  • 将 Heroku App 导出到新的 GitHub 存储库 [重复]

    这个问题在这里已经有答案了 我有一个 Heroku 项目 我使用Heroku CLI我想将该项目转移到new我的 GitHub 帐户上有 repo 但我对这些 遥控器 的工作原理感到非常困惑 我只发现人们试图做相反的事情 从 GitHub
  • 如何使用自制程序在 Mac OS X 上安装 GTest?

    我正在尝试使用数据包管理器安装 gtest自酿啤酒但没有它的存储库 我尝试从 code google 下载 gtest 但我不明白如何安装它 因为cmake and make不解决问题 如果您想要最新版本而不使用 Homebrew git
  • Tkinter:单击按钮时如何将按钮的文本作为参数传递给函数

    我有以下代码 可以生成 5x5 尺寸的随机按钮网格 import tkinter as tk from tkinter import from tkinter import messagebox import random def numb
  • 为什么我无法在 MinGW 中链接 64 位 .lib 文件?

    我需要在使用 MinGW 的 Eclipse CDT 中的项目中使用第三方 lib dll 文件 可能在 Visual Studio 中编译 我可以成功地动态链接到 32 位版本 使用 32 位 MinGW 但不能成功链接到 64 位版本
  • 用于 Pl/SQL 开发的 IDE [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有免费的 PL SQL 开发 IDE I use SQL开发人员 http www oracle com technology pro
  • 运行时从Jar文件加载资源

    我正在尝试从运行时添加的 Jar 文件加载资源 但没有走得太远 这是我的代码 常规 URL url new URL jar file out resource jar test resource def urlList lt lt url
  • sap abap 中系统忽略条件的循环

    我尝试应用带有条件的循环来总结相应的行 字段 其中条件应该是正确的 但在系统运行期间 程序忽略了条件并总结了所有行 有什么建议来解决这个问题吗 SELECT FROM LIPS INTO CORRESPONDING FIELDS OF TA
  • WebService 在 WebLogic 10.3 中不“可见”

    我目前正在尝试让我的应用程序提供网络服务 该应用程序使用 spring 并在 Weblogic 10 3 实例下运行 我按照 合同第一 的方法构建了网络服务 所以我基本上拥有的是生成的 WS 接口 该接口的实现 定义 servlet 绑定的
  • 从欧洲DTCO公司卡读取数据

    我需要能够从欧洲数字行车记录仪公司卡 智能卡 读取卡和公司识别数据 这些在文档中进行了描述委员会条例 EC No 1360 2002 http eur lex europa eu LexUriServ LexUriServ do uri O
  • Oracle 11g“绑定变量不存在”

    我在以下代码中收到 ORA 01006 绑定变量在第 15 行不存在 错误 DECLARE v search string varchar2 4000 OK v query str VARCHAR2 4000 match count int
  • 在 Web Deploy 工具中设置自动备份

    我一直在努力设置自动备份 但似乎遇到了困难 按照此document http www iis net learn publish using web deploy web deploy automatic backups 并使用 Power
  • 读取许多文件,计算一些内容,将结果保存在数据帧中(R)

    我有大约 100 个文件 长文件名 其中包含来自模拟的数据 主题是两种物质的降解 所以我有 3 个相关列 时间 物质 1 的相对浓度 Sub1 从 1 0 到零 和相对浓度 物质 2 Sub2 我想读取文件 确定每种基材 99 降解的时间
  • 将字节数组转换为对象

    C 有没有办法将纯字节数组转换为对象 例如给定这个类 class Data public int int1 public int int2 public short short1 public long long1 我希望基本上能够做这样的