全球信息:未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配
【资料图】
出错场景
在调试海康SDK时,将struct类型的实例压入内存时,提示了改错误信息,具体代码如下:
CHCNetSDK.NET_DVR_ALARM_DEVICE_USER alarmDeviceUser = new CHCNetSDK.NET_DVR_ALARM_DEVICE_USER();alarmDeviceUser.sPassword = Encoding.UTF8.GetBytes("a77777777");//输入指针IntPtr ptrInput = Marshal.AllocHGlobal(Marshal.SizeOf(alarmDeviceUser));// 这一句话报错Marshal.StructureToPtr(alarmDeviceUser, ptrInput, false);
错误截图如下:
错误说明
单从字面上去理解,就是长度不一样,说白了就是alarmDeviceUser和ptrInput在内存的长度不一致,导致放入内存的时候放不进去。
排除原因
一开始怎么都不知道啥原因,因为Marshal.SizeOf(alarmDeviceUser)拿到的肯定是alarmDeviceUser的长度,其他代码在海康威视中都有例子,这里面只有一句话是自己的,就是alarmDeviceUser.sPassword = Encoding.UTF8.GetBytes("a77777777")
。那这句有什么问题吗。
错误说明
通过排查可以得出来alarmDeviceUser.sPassword
默认的值是16,而如果使用这个赋值以后,他的长度变为了9。什么意思呢,就是单论alarmDeviceUser
实例的时候,sPassword长度是9;Marshal.SizeOf(alarmDeviceUser)计算长度时,sPassword默认是16。这样子就导致了长度不同。
为了便于定位问题,我们将NET_DVR_ALARM_DEVICE_USER
修改为只有sPassword,运行后可以看到nSize和sPassword大小的不同
修复问题
如何修改呢,只需要将 alarmDeviceUser.sPassword = Encoding.UTF8.GetBytes("a77777777");
修改为Encoding.UTF8.GetBytes("a77777777").CopyTo(alarmDeviceUser.sPassword, 0)
;即可。
不过如果该byte数组为null,则不会出现这个问题,应该是在StructureToPtr时,针对null的有判断。
关键词:
上一篇:最新资讯:星网宇达:公司为美团无人配送车提供惯导部件
下一篇:最后一页
- 全球信息:未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配
- 最新资讯:星网宇达:公司为美团无人配送车提供惯导部件
- 第二届中国花生产业高质量发展大会即将在山东莱西启幕
- 科大讯飞回应出现重大风险至股价大幅下跌:谣言,系某生成式AI散布不实消息导致
- 每日看点!热血无赖没有云存档 热血无赖没任务了
- 世界讯息:连云港赣榆:提升品质、扮绿惠民 让市民出门见绿、开门见美
- 焦点速递!我的女孩,我的猎物(下)
- 解压缩软件可以卸载了,Windows 11 原生支持 RAR、7-ZIP 等压缩格式_当前独家
-
全球热门:这次我被“黄色”惊到了,它柔软、浪漫、减龄,太漂亮了,不适合夏天穿
或者是高腰的A字裙搭配大裙摆,让明快的橙黄色显得优雅俏皮,也比较实用,对下半身皮肤和不同年龄段的女性
-
关于腾飞集团集资事件的处置-天天热点评
今日上午,继前天会议后,我市再次召开专题会议,紧急研究腾飞集团集资事件处置工作。会议要求,要迅速采取
-
办理房屋解抵押所需材料都有哪些?还完房款怎样解除房屋抵押?
一、还完房款怎样解除房屋抵押还完房款解除房屋抵押的办理流程是:1 贷款结清。借款人贷款结清后,持银
-
当前快播:警惕美国经济金融政策负面外溢效应(经济透视)
杨子荣继美国硅谷银行和签名银行关闭之后,资产规模更大的第一共和银行近期也被美国政府关闭并接管。美国银
X 关闭
X 关闭