Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么这个字节到结构的反序列化单元测试失败了?

为什么这个字节到结构的反序列化单元测试失败了?
EN

Stack Overflow用户
提问于 2019-11-11 21:28:44
回答 1查看 64关注 0票数 2

我有一个简单的结构:

代码语言:javascript
运行
AI代码解释
复制
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)]
public struct TestStruct
{
    public bool Valid;     // 1
    public UInt64 Value1;  // 8 
    public UInt64 Value2;  // 8
    public float Value3;   // 4
}

以及这个从字节数组到结构方法的泛型:

代码语言:javascript
运行
AI代码解释
复制
public static T ByteArrayToStructure<T>(byte[] bytes) where T : struct
{
    var handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
    try 
    {
        return (T) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
    }
    finally 
    {
        handle.Free();
    }
}

下面是这个简单的单元测试:

代码语言:javascript
运行
AI代码解释
复制
[Test]
public void BytesToMyStruct()
{
    const bool Valid = true;
    const UInt64 Value1 = 1;
    const UInt64 Value2 = 2;
    const UInt64 Value3 = 99;

    var validBytes = BitConverter.GetBytes(Valid);
    var value1Bytes = BitConverter.GetBytes(Value1);
    var value2Bytes = BitConverter.GetBytes(Value2);
    var value3Bytes = BitConverter.GetBytes(Value3);  

    // 1 + 8 + 8 + 4 = 21
    var testBytes = new byte[21];

    Array.Copy(validBytes, 0, testBytes, 0, 1);
    Array.Copy(value1Bytes, 0, testBytes, 1, 8);
    Array.Copy(value2Bytes, 0, testBytes, 9, 8);
    Array.Copy(value3Bytes, 0, testBytes, 17, 4);

    var myStruct = ByteUtils.ByteArrayToStructure<TestStruct>(testBytes);

    Assert.That(myStruct.Valid, Is.EqualTo(true));
    Assert.That(myStruct.Value1, Is.EqualTo(1));
    Assert.That(myStruct.Value2, Is.EqualTo(2));
    Assert.That(myStruct.Value3, Is.EqualTo(99));
}

在这个单元测试中,我只是希望手动填充一个字节数组,反序列化为一个结构,并确保结构的属性等于字节数组中设置的属性。我假设我通过Array.Copy重复手动复制到相同字节数组的方法失败了,因为当我执行单元测试时,我收到一条失败消息,指出没有正确设置Value1

代码语言:javascript
运行
AI代码解释
复制
Expected: 1
But was:  0

出于单元测试的目的,我不确定是否通过手动设置字节数组来正确设置它们。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-11 22:46:45

根据BOOL的微软/Windows API定义,System.Boolean的默认封送处理行为是4字节整数。因此,Marshal.PtrToStructure假设TestStruct的非托管表示为24字节,前4个字节由TestStruct.Valid占用,这会丢弃Value1和其他字段。

您可以通过对bool字段应用[MarshalAs(UnmanagedType.I1)]属性来更改此行为。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58808933

复制
相关文章
RethinkDB:​​为什么我们失败了
本文来自rethinkDB失败后的复盘,正是因为有点年代现在拿出来看更有意思,可以对复盘作个复盘,哪些分析和对未来(也就是今天)的判断不对,原文地址:https://www.defmacro.org/2017/01/18/why-rethinkdb-failed.html
sealyun
2022/05/17
1.4K0
RethinkDB:​​为什么我们失败了
为什么RPA项目失败了呢?
要问2019年哪个领域最火,肯定少不了RPA。RPA是机器人流程自动化,可以模拟人与计算机的交互过程。简单点说,那些基于固定规则不断重复、标准化的工作,例如读取邮件、对账汇总、采集数据、制作报表等费时费力,让你不胜其烦的工作,都可以交给RPA来完成。
RPA小葵
2020/04/08
7480
为什么RPA项目失败了呢?
刷到 LeetCode 这个评论,我沉默了!
今天给大家分享的 LeetCode 的评论来源于 LeetCode 上的剑指 Offer 53 号问题0~n-1中缺失的数字的评论区。
五分钟学算法
2022/04/08
4490
刷到 LeetCode 这个评论,我沉默了!
为什么你的大多数监控策略都失败了
作者 | Abdul Fattah Popoola 译者 | Sambodhi 策划 | 褚杏娟 未经验证的可观察性和随时待命的团队总会不可避免地遇到反应中断,而要想减少中断是很痛苦的,因为这就像蒙住双眼在大海捞针。我之所以知道这些,是因为我曾稳定了经历过混乱的团队。 未检测到的降级导致用户感到痛苦。 无休止的、海啸般的嘈杂警报。 24 小时待命压力,难以承受,不可持续。 这篇文章是针对那些因为一直救火而精疲力竭的工程师们,对想要将一项成熟技术加入到工具箱中的管理者来说,也有所帮助。毕竟有谁会不喜
深度学习与Python
2023/03/29
4370
为什么你的大多数监控策略都失败了
进字节了!
终于进字节跳动了!这里说的不是我自己,而是我的一位朋友。 为了成功进入字节,他都做了哪些准备的呢?他准备的重点内容是数据结构和算法。 在此,他给大家推荐两份来自字节跳动大佬的算法进阶指南,据说有不少小伙伴都靠这份指南成功掌握了算法的核心技能,拿到了 BAT offer。希望对大家有帮助。 第一份资料是 70K Star 的《labuladong 的算法小抄》(作者 labuladong)。 先来给你们看看里面具体都有哪些内容: 现在这本 PDF 免费分享给你,你可以扫描下方二维码回复 算法 来领取这本
纯洁的微笑
2022/04/18
4870
进字节了!
SpringBoot单元测试依赖注入失败
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.sunnada.gaia.data.web.AutomaticSealTest': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.sunnada.gaia.data.web.controller.construction.AutomaticStampController' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@javax.annotation.Resource(shareable=true, lookup=, name=, description=, authenticationType=CONTAINER, type=class java.lang.Object, mappedName=)}
用针戳左手中指指头
2021/01/29
2.3K0
SpringBoot单元测试依赖注入失败
结构体的字节是多大
简要说明:结构体成员按照定义时的顺序依次存储在连续的内存空间,但是结构体的大小并不是 *** 简单的把所有成员大小相加,而是遵循一定的规则,需要考虑到系统在存储结构体变量时的地址对齐问题。*
每周聚焦
2022/10/21
9440
结构体字节对齐
      在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。       内存对齐的原因:       1)某些平台只能在特定的地址处访问特定类型的数据;       2)提高存取数据的速度。比如有的平台每次都是从偶地址处读取数据,对
_gongluck
2018/03/08
1.6K0
结构体字节对齐
结构体字节对齐
结构体字节对齐       在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列, 而不是简单地顺序排列,这就是内存对齐。 计算结构变量的大小必须讨论数据对齐的问题。为了使CPU存取的速度最快(这同CPU取数操作有关),c++在处理数据时经常把结构变量中的成员的大小按照4或
猿人谷
2018/01/17
1.3K0
结构体字节对齐
为什么Java有了synchronized之后还造了Lock锁这个轮子?
众所周知,synchronized和Lock锁是java并发变成中两大利器。但是为什么Java有了synchronized之后还是提供了Lock接口这个api,难道仅仅只是重复造了轮子这么简单么?本文就来探讨一下这个问题。
三友的java日记
2022/07/27
2170
你的项目失败全因为这个原因
程序员在设计系统或者做需求分析时,难免会因为需求分析的不充分或者因为一些现象而迷惑了自己,最终导致模型不稳定而使项目举步维艰甚至项目失败。然而,这些都是可以通过一些方法避免的,今天我们就试图通过逻辑学里的一些方法来解释这一切。
ImportSource
2019/07/04
5360
你的项目失败全因为这个原因
LD_PRELOAD 劫持 PWD 为什么失败了 | Linux 后门系列
对于大多数对技术没有那么偏执的兄弟在这里可以结束了,上面内容作为LD_PRELOAD后门知识点的补充
意大利的猫
2021/06/15
2.2K0
LD_PRELOAD 劫持 PWD 为什么失败了  |  Linux 后门系列
maven执行单元测试失败后继续
最近在进行sonarqube与maven集成时,如果pom文件配置了sonarqube相关配置,那么在pom文件所在目录执行
johnhuster的分享
2022/03/28
1.8K0
OpenFlow协议库开发者指南
介绍 OpenFlow协议库是OpenDaylight的一个组件,调解OpenDaylight controller和支持OpenFlow协议的硬件设备之间通信。主要目标是提供用户(或上层OpenDaylight)通信通道,可用于管理网络硬件设备。 功能概览 Openflowjava内部的三个特性: 1)odl-openflowjava-protocol提供全部的openflowjava bundles, 需要与openflow设备通信. 它可以确保消息的转换和处理网络的连接. 它还提供了openf
SDNLAB
2018/04/02
3.1K0
OpenFlow协议库开发者指南
单元测试是什么?为什么要做单元测试?
单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确,通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为1。
测试小兵
2019/11/20
2.8K0
这个恶意软件“奇葩”的反虚拟机技巧
最近,我分析到一个行为异常的恶意软件样本。由于很难发现该恶意软件的真实行为,所以我花了很多时间去调试分析。然而在分析过程中,又有多种因素会导致运行崩溃和异常。在此,我就发表了对该恶意软件反虚拟机的一些
FB客服
2018/02/08
1.3K0
这个恶意软件“奇葩”的反虚拟机技巧
为什么要写单元测试?
单元测试从长期看可以提高代码质量、降低维护成本、为重构提供质量保障。但是从短期看加重了工作量,对于处在项目紧张的人员来说会增加很多负担。
ExASIC
2020/10/30
9090
简评 WhereHows 为什么失败
DataHub 是由领英的数据团队开源的一款提供元数据搜索与发现的工具。现在的 DataHub 是由 WhereHows 演变过来的。
哒呵呵
2021/12/18
9230
简评 WhereHows 为什么失败
为什么 demangle 会失败?
本周有位网友在交流群提到“为什么无法在自己的电脑中通过 c++filt 解析符号 _ZN5folly6detail15str_to_integralIxEENS_8ExpectedIT_NS_14ConversionCodeEEEPNS_5RangeIPKcEE ?”
酷酷的哀殿
2020/10/26
1.2K0
为什么 demangle 会失败?
点击加载更多

相似问题

为什么这个查询失败了?

22

为什么这个foreach失败了?

22

为什么这个原型失败了?

22

为什么这个SFINAE失败了?

23

为什么这个搜索失败了?

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文