网易首页 > 网易号 > 正文 申请入驻

相同的结构体,服务端和客户端字节长度差8个字节,咋回事呢?

0
分享至

代码报了个错:“byte array size is smaller than the size of the structur”,意思就是byte数组的大小小于结构体的大小,这个错报出来的原因是我代码中有个逻辑,需要将byte数组转换成结构体,但很显然,我没有转换成功,这是咋回事呢?

这个错报得我莫名其妙的,找了一个小时左右都没找到问题出在哪,但是最后发现问题的时候,我甚至有些无语。在说清楚问题到底出在哪之前,我们得先了解下代码的业务逻辑,然后您就知道为什么开始我觉得莫名其妙了!

代码的业务逻辑是这样的,我们的业务中有一个服务端和很多个客户端,客户端会定期给服务端发送消息,消息是以结构体的形式发送的,当然,在发送消息的时候,需要将结构体转换成byte数组。

为了确保发送消息的一致性,我特地封装了一个专门用来处理消息的函数库,这样就能确保每个客户端在发送和接收消息的时候不会出现任何差错。

但是,差错偏偏就出现了!在某个客户端上就出现了文章开头的那个错!

经过调试,我发现所有客户端发送的消息内容都是一样的,并没有任何区别。

结构体属于基本数据类型,因此在定义的时候,长度就已经确定了,我在服务端进行调试,发现结构体的长度为288,但是,服务端接收到的byte数组长度却只有280,如此一来,在将byte转换成结构体的时候,因为长度不一致,导致了转换失败。

前面说了,我专门封装了一个消息处理的库,服务端和客户端使用的是库里面同一个结构体,不可能会出现两边长度不一致的情况。

事出反常必有妖!

服务端是同一个服务端,因此问题只可能出现在客户端的代码上!因为我们的客户端有不同版本,每个版本有单独的代码,而代码只有略微差别。

我拿了不同版本的客户端代码进行调试,诡异的是,出问题的那个客户端在发送消息时,结构体的长度偏偏就是280,而其他客户端在发送消息时,结构体长度却是288!

一个小时都过去了,我硬是没找出问题所在,于是,我只能使用笨办法,那就是作对比,看看出问题的客户端代码和没出问题的客户端代码有什么不同。

这么一对比,就让我找到了差异点,原来,出问题的客户端代码在编译的时候勾选了“首选32位”,我一拍脑袋:“原来是这样!”

这个结构体的内容很简单,里面是由一个Int64字段+两个Int32字段+一个指针+一个指定了长度的字符串字段组成,其中,字符串的长度被指定为255。

公司代码是用C#编写的,在C#中,正常情况下,Int64所占字节数为8位,Int32所占字节数为4位,指针所占字节数为8位。

而指针类型在32位环境和64位环境里面所占用的字节是不一样的,在32位环境里占4个字节,而在64位环境里则占8个字节!

结语

因此,最终真相大白!于是我去除勾选“首选32位”,再次编译,发现结构体的长度变成了288!

说到这里,肯定有人关心为什么项目被勾选了“首选32位”,因为我一直没有将代码上传代码库,所以具体是怎么发生的,其实我也不知道,也许是IDE默认就给勾上了,但是因为一直没测到这,所以问题一直没被发现。

声明:个人原创,仅供参考

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
中乌极罕见一幕发生,普京和特朗普全都没想到:泽连斯基胆这么肥

中乌极罕见一幕发生,普京和特朗普全都没想到:泽连斯基胆这么肥

咸鱼金脑袋
2026-02-15 21:41:11
美国华人直言:中国手机扫码支付是最不智能的发明!

美国华人直言:中国手机扫码支付是最不智能的发明!

阿伧说事
2026-01-20 12:53:01
“津”非昔比|老照片里寻年味儿

“津”非昔比|老照片里寻年味儿

环球网资讯
2026-02-15 21:36:37
陈文:被解除留置措施

陈文:被解除留置措施

云头条
2026-02-15 21:03:22
安布:巴斯托尼很不体面,他既对不起足球,也对不起他自己

安布:巴斯托尼很不体面,他既对不起足球,也对不起他自己

懂球帝
2026-02-15 14:05:41
中美印土地沙化面积对比:印度3亿亩,美国16亿亩,中国多少?

中美印土地沙化面积对比:印度3亿亩,美国16亿亩,中国多少?

给时光以生命
2026-02-15 20:48:09
郑丽文终于表态了:提出统一3大主张!大陆破例批准,局势或变?

郑丽文终于表态了:提出统一3大主张!大陆破例批准,局势或变?

风眼军情
2026-02-14 20:34:14
上海母亲带娃坐火车,票买全了却只到徐州,车上被查出“半张票

上海母亲带娃坐火车,票买全了却只到徐州,车上被查出“半张票

网络易不易
2026-02-15 14:20:07
大阪持刀伤人事件致1人死亡!中国领事馆再次提醒近期避免前往日本

大阪持刀伤人事件致1人死亡!中国领事馆再次提醒近期避免前往日本

每日经济新闻
2026-02-15 12:11:05
日本的苦日子,还在后面

日本的苦日子,还在后面

六爷阿旦
2026-01-20 17:07:06
女子故意扮丑去相亲,男子一眼看中,女子吃惊:他是不是太饿了

女子故意扮丑去相亲,男子一眼看中,女子吃惊:他是不是太饿了

丫头舫
2026-02-10 22:18:05
高市怕什么来什么,联合国修改二战历史,将日本钉在耻辱柱上

高市怕什么来什么,联合国修改二战历史,将日本钉在耻辱柱上

今日养生之道
2026-02-15 13:46:20
央视春晚首次将手机接入广播级系统,华为Mate 80系列为指定设备

央视春晚首次将手机接入广播级系统,华为Mate 80系列为指定设备

PChome电脑之家
2026-02-13 14:36:58
《生命树》终章:林培生孤立,白菊秘而不宣,张勤勤胜冯克青。

《生命树》终章:林培生孤立,白菊秘而不宣,张勤勤胜冯克青。

小陆搞笑日常
2026-02-15 19:41:04
假期首日60岁以上旅客入住酒店增60%,“反向过年”的爸妈涌入北上广深

假期首日60岁以上旅客入住酒店增60%,“反向过年”的爸妈涌入北上广深

第一财经资讯
2026-02-15 19:19:14
黄金有没有可能突然暴跌,让我们一下子被套牢30年呢?

黄金有没有可能突然暴跌,让我们一下子被套牢30年呢?

流苏晚晴
2026-02-15 18:08:01
易梦玲一双金灿灿的大灯,明艳晃眼

易梦玲一双金灿灿的大灯,明艳晃眼

吃瓜党二号头目
2026-02-13 08:13:30
“县城家长就这审美”,家长晒女儿街边走秀,围观路人却满脸尴尬

“县城家长就这审美”,家长晒女儿街边走秀,围观路人却满脸尴尬

妍妍教育日记
2026-02-14 17:40:57
闫学晶又迎噩耗,最担心的事还是发生了,儿媳体制内工作恐难保

闫学晶又迎噩耗,最担心的事还是发生了,儿媳体制内工作恐难保

离离言几许
2026-01-23 00:04:19
实名举报河南矿山集团崔培军老板“恶意发钱”!

实名举报河南矿山集团崔培军老板“恶意发钱”!

布衣乱弹
2026-02-15 11:18:42
2026-02-15 22:20:49
程序员古耕 incentive-icons
程序员古耕
程序员、网文作家、自媒体人
597文章数 387关注度
往期回顾 全部

科技要闻

发春节红包的大厂都被约谈了

头条要闻

小米YU7刚交付20分钟传出一声巨响 车主看到裂痕崩溃

头条要闻

小米YU7刚交付20分钟传出一声巨响 车主看到裂痕崩溃

体育要闻

最戏剧性的花滑男单,冠军为什么是他?

娱乐要闻

河南春晚被骂上热搜!大量广告满屏AI

财经要闻

谁在掌控你的胃?起底百亿"飘香剂"江湖

汽车要闻

奔驰中国换帅:段建军离任,李德思接棒

态度原创

家居
本地
艺术
时尚
公开课

家居要闻

中古雅韵 乐韵伴日常

本地新闻

春花齐放2026:《骏马奔腾迎新岁》

艺术要闻

159米!北京CBD最被低估的建筑:设计很能打,存在感却不高

多巴胺失宠了?过年这样穿彩色时髦又减龄

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版