说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

在java中,写socket通讯是如何读取从C++发过来的一个结构数据?

编辑:说三道四文库 发布时间:2017-10-18 02:53
HTML文档下载 WORD文档下载 PDF文档下载
在发送端的发送的是类似如下一个结构:
struct{
  int id;
  char title[50]
  int type;
};

在java中如何读取类似的结构,并把它构造成一个类似以下的类:
class TestStruct{
  int id;
  String title;
  int type;
};



我们是不是可以换一种形式来发送呢

比如把这个结构转化成xml的形式 ,
用JNI来取得三个成员值。
要看你用的是什么socket类,如果是java.net.Socket的话,就直接从Socket的InputStream读取出数据,例如:

byte[] buf = new byte[58];
socket.getInputStream().read( buf );

TestStruct test = new TestStruct();
test.id = (buf[0]&0xFF) | ((buf[1]&0xFF) << 8) | ((buf[2]&0xFF) << 16) | ((buf[3]&0xFF) << 24);
test.title = new String( buf, 4, 50 ); 
test.type = (buf[54]&0xFF) | ((buf[55]&0xFF) << 8) | ((buf[56]&0xFF) << 16) | ((buf[57]&0xFF) << 24);


什么啊.看了就头大啊.
lutao050306() 
什么啊.看了就头大啊.
---------------------------------------
呵呵,小朋友当然看不懂了!
  
 
> 在java中,写socket通讯是如何读取从C++发过来的一个结构数据?

我觉得,最好换一个视角看待这个问题。写 Java 程序,需要从 socket 里取出一个结构化的数据,不要想着这个数据是谁写进来的,只把它当作字节流看待就好了。这几个字节是什么,接下来的那几个字节是什么……然后把它组装到一个 object 里面去。

同时,在 C++ 那头,也不要简单地 send((void*)&st, sizeof(st)),而是老老实实地把要传送的数据一个一个地发送出去。这样你就能保证发送的每一个字节都在你的控制之下,符合你自己制定的“传输协议”。
按你们这样是比较难实现的.
可以用ASN.1 
直接在不同语言中传送对象 结构数据等了
你给出的两个结构完全不能兼容。

肯定不是用JNI解决问题就是了。
我认同那个没有读过高中的人的建议。但是很好的适应性。

其实让C++照顾一下Java的理解能力比较好,不要搞结构。
然后用Axis就接受,就一马平川了。
> 你给出的两个结构完全不能兼容。

也不能这么说吧。二进制(物理存储)级上的确*不兼容*,但从逻辑上讲,“一个整数/一个字符串/一个整数”,这又可以看作是*兼容*的。

leehq(没有读过高中的人) 的方法思路是对的,但需要 C++ 那边的配合(可能这就是你说的“不要搞结构”),否则的话,通过 socket 传过来的未必是 58 个字节。

顺便提一下,leehq(没有读过高中的人) 老兄的方法中,test.title = new String( buf, 4, 50 ); 有点问题,C++ 中的字符串是 null-terminated,并不一定是 50 个字节长。
maquan('ma:kju) :
顺便提一下,leehq(没有读过高中的人) 老兄的方法中,test.title = new String( buf, 4, 50 ); 有点问题,C++ 中的字符串是 null-terminated,并不一定是 50 个字节长。
-----------------------------------------------------------------
你没看这个结构吗,怎么不是50个字长?
struct{
  int id;
  char title[50]
  int type;
};
对 这样是可以的
大家没有遇到C结构体里面存在int[]德情况吧,想一想遇到这样的情况该如何处理呢?
> 你没看这个结构吗,怎么不是50个字长?
> struct{
>   int id;
>   char title[50]
>   int type;
> };

你误会我的意思了,我不是说这个结构里的字节数。这是一个有 50 字节的 char 数组,在 C/C++ 里能够表示一个不超过 49 字节的字符串。当你在 Java 中创建一个等价的字符串的时候,首先需要判断实际的字符串长度(按照 C/C++ 的语法,也就是 null-terminated),然后再去 new String(),而不应该直接 test.title = new String( buf, 4, 50 );
javaoaout(javaoaout) 
大家没有遇到C结构体里面存在int[]德情况吧,想一想遇到这样的情况该如何处理呢?
--------------------------------------------------------------------------------
要看数组的长度,如果是int[4],那么长度就是4*sizeof(int)。



maquan('ma:kju) 
你误会我的意思了,我不是说这个结构里的字节数。这是一个有 50 字节的 char 数组,在 C/C++ 里能够表示一个不超过 49 字节的字符串。当你在 Java 中创建一个等价的字符串的时候,首先需要判断实际的字符串长度(按照 C/C++ 的语法,也就是 null-terminated),然后再去 new String(),而不应该直接 test.title = new String( buf, 4, 50 );
----------------------------------------------------------------------------------
你说得不错,但我只是简单示范一下而已,具体的实现当然要变通一下了。


 
mark up
不用去理会对方是什么方式产生的该结构,java这边只需要将其理解成输入的数据流即可,在读取的时候按照对方约定的数据格式读取即可。

就好比你读取一个位图文件,你不必去理会这个位图文件是用什么语言写的程序生成的一样,你只需要按照这个位图文件的格式读取就行了,这样的程序你可以用c++写,可以用C#写,也可以用java写。
收获颇丰,多谢了!
建议使用SOAP通讯,这样简单多了
收获颇丰?
你不会结贴吗?
支持用xml
了解每种类型的字节数,高低位,就可以为所欲为了
呵呵
例子 double 
long l;

l = b[0];
l &= 0xff;
l |= ((long) b[1] << 8);
l &= 0xffff;
l |= ((long) b[2] << 16);
l &= 0xffffff;
l |= ((long) b[3] << 24);
l &= 0xffffffffl;
l |= ((long) b[4] << 32);
l &= 0xffffffffffl;

l |= ((long) b[5] << 40);
l &= 0xffffffffffffl;
l |= ((long) b[6] << 48);

l |= ((long) b[7] << 56);
return Double.longBitsToDouble(l);
发一段我的程序和linux下的C通讯的代码,希望对你有所启示.
//发送获取资源列表的命令
            Log.log("\n 开始发送获取资源列表的命令:-----------------\n");
            outData.write(strHead.getBytes());
            outData.writeByte(version);
            outData.writeInt(reverseByte_32(serial));
            outData.writeShort(reverseByte_16(type));
            outData.writeShort(reverseByte_16(sub_type));
            outData.writeInt(reverseByte_32(len));
            outData.writeInt(reverseByte_32(result));
            outData.writeLong(reverseByte_32(timeout));

            //接收返回信息
            Log.log("\n 开始接收~获取资源列表~返回信息:-----------------\n");
            byte head[] = new byte[16];
            inData.read(head);
            String strHead_b = new String(head, "GB2312");

            byte version_b = inData.readByte();
            int serial_b = reverseByte_32(inData.readInt());
            short type_b = reverseByte_16(inData.readShort());
            short sub_type_b = reverseByte_16(inData.readShort());
            int len_b = reverseByte_32(inData.readInt());
            int result_b = reverseByte_32(inData.readInt());

....
.....

=======================================================

//java的16BIT的数据格式转换为C语言的数据格式。
    public static short reverseByte_16(int param) throws Exception {
        String order = SysConfig.loadSysConfig("System.byteOrder");
        if (order.equals("1")) { //高字节序传送数据,无须任何转换
            return (short) param;
        }
        int r1 = param & 0x000000ff;
        r1 <<= 8;
        param >>= 8;
        int r2 = 0x0000ffff & param;
        short result = (short) (r1 | r2);
        return result;
    }

//java的32BIT的数据格式转换为C语言的数据格式。
    public static int reverseByte_32(int param) throws Exception {
        String order = SysConfig.loadSysConfig("System.byteOrder");
        if (order.equals("1")) { //高字节序传送数据,无须任何转换
            return param;
        }
        int r4 = param & 0x000000ff;
        r4 <<= 24;
        int r3 = param & 0x0000ff00;
        r3 <<= 8;
        param >>= 8;
        int r2 = param & 0x0000ff00;
        param >>= 16;
        int r1 = 0x000000ff & param;
        int result = (int) (r4 | r3 | r2 | r1);
        return result;
    }
专访图书作者祁宇:C++11让程序更简洁、更现代、更强大 滴滴打车CTO张博:生死战役,技术和时间赛跑 Qualcomm拥抱创客文化:如何基于DragonBoard 410c创造和创业? 【探秘ES6】系列专栏:剩余参数和默认参数 专访资深程序员庄晓立:我为什么要选择Rust? 主会讲师确认,2015中国人工智能大会火热报名中 容联&#183;云通讯线下沙龙:IM 5.0助力App社交化 【CTO讲堂】全数据驱动产品优化,美国互联网公司A/B测试经验分享 《近匠》易快报:以报销做企业消费场景下的Slack 纷享销客D轮融资1亿美金,启动开放平台战略! 专访4秒源码商城CTO陈杰:扎根互联网的“不安的心” iOS UIView动画实践(一):揭开Animation的神秘面纱 【前端人生】Teambition前端工程师陈涌:非计算机专业,依托社区不断成长壮大 iOS UIView动画实践(二):Spring Animation与人机交互 基因组与数据整合:DNA应用开发正在临近 2015 PHP框架调查结果出炉,Laravel最受欢迎! 【CTO会员专访】KEEN创始人兼CEO王琦:在GeekPwn,遇见一极棒的安全人才 创业公司都在使用的3款Python库 深入理解Objective-C的Runtime机制 你不知的Docker 创办人兼CTO游走美法的浪漫狂放 《近匠》环信CEO刘俊彦:移动客服的未来化场景 iOS UIView动画实践(三):Transition Animation 【CTO讲堂】无社交,不App!——为App加载强大的通讯社交引擎 【探秘ES6】系列专栏(七):箭头函数 【前端框架】Backbone.js在大型单页面应用中的应用实践 【探秘ES6】系列专栏(六):解构赋值 《近匠》TestBird,专注的手游自动化云测试平台 【探秘ES6】系列专栏(八):JS的第七种基本类型Symbols 专访李林锋:我与Netty那些不得不说的事 手把手教学:巧用Core Data和RubyMotion开发iOS应用 《近匠》琥珀天气,精细化打磨征服Google Play 感慨!!!(潜水一年,吐个泡,顺便发表一点意见) 帮个忙 怎么在Installshield中创建对话框,并操作ACCESS数据库? 连续给分:邮件服务器防病毒问题! 我想编译一个像API一样的dll 启动rose就出错,高手来看,100分 关于打印的一个问题 急!!!请提供一段设置Session的全部代码,谢谢!! 请问,从第二帧开始播放的代码的什么??? 老师要求编写五子棋的程序可是我实在想不出该怎么设定估价函数啊帮帮忙啊? 感觉压力比较大,活不下去,想跳楼自杀的进来侃侃 一个关于php提交表单的问题。 各位大侠,要命问题! 怎么在Installshield中创建对话框,并操作ACCESS数据库? win2000server的管理员密码让人改了,怎么办呀! 太气愤了,帮帮我? 用BDE连接MS SQL SERVER,为什么运行后出现未知用户名或密码的错误? datagrid中能不能进行统计 如何编写“outlook”风格的界面 如何实现flash截图?我研究了好久也不明白,希高手指点!(在线等待) 程序调用的DLL 在delphi中,用ADO如何实现将SQL中多表导出到一个Access中? 无聊啊无聊 想考软工???? Socket奇怪的问题! foxpro中如何实现按一按钮启动word和excel,并且直接弹出打开文件对话框? 关于分级权限管理(300分) 紧急求救!!!!!!!! 客户端web服务是否需要别的控件支持 帮帮我,朋友们请进.... Datareport问题! [cclq]竞选斑主,附我的方针! 用VB编写自己的服务器端组件 DAO问题,CDaoRecordset::addnew()和CDaoQueryDef::Execute插入一条记录,哪个更快? 谁能解释一下这个比较模糊的问题?关于地图窗口HWND。 闲人免进!如何增加信誉分! 如何改变Mem控件中插入符的形状? 各位大虾有没有检测日期的合法性的JAVASCRIPT脚本啊 怎么在Installshield中创建对话框,并操作ACCESS数据库? 两个问题,关于struts中form的action如何传递一个变量?如何使用科学计数变成普通数值? 救落水美女注意事项 如何学习NOTES? 急!!急!!给多分呀!!! 寻在windows下安装bugzilla时缺少的两个文件。 菜鸟问题。。。。。。需大师回答啊 怎样由实例句柄得到传口句柄? 请问,VB的DataReport是否有支持套打的功能? 有关ant和struts的问题,急。 有人用Panorama来做自动化测试吗? 请问各位,如何用PHP来实现这个功能啊! 关于列换顺序的问题 直线AB,CD交于O点,OE,OF分别平分角AOC,角BOC,若角AOD:角EOC=4:1,求FOD的度数如图 三栋楼共用两个塔吊,垂直运输费怎样计取 英语翻译Care should also be taken with the compression of the video and the packaging of the DVD in order to best present one's work. 自然界的风声是由空气震动而产生的 是对还是错 双性恋心理是怎样产生的? 英语翻译_aid_ is a pile of pure shit.先填两个字母一个空一个,然后翻译 如果给物体加热 但物体无物态变化 是不是分子势能没有变化(无物态变化时分子间距离有没有改变?) 怎么让双性恋发现自己是双性恋?我是gay,喜欢一个男的,从种种举动上发现他是双性恋,要怎么让他发现他是双性恋呢?来点实际的办法.不过别太过就OK 一个正方形,如果一边增加6厘米,另一边增加2厘米,所得到的长方形面积比原正方形面积多92平方厘米,求原正方形的边长 请用小学的知识回答问题 急急!!明天就要交了 直线AB,CD,EF相交于点O,若∠AOD=∠3FOD,∠AOE=120°,则∠EOC的度数为 如何研磨胆矾 《生物化学》王镜岩上下册的课后题答案 一个20尺货柜能装多少8公斤干粉灭火器要算上灭火器的外包装啊 水的蒸汽和胆矾研磨均属于什么变化?此过程什么发生了变化 求王镜岩生物化学第三版上下册全部的课后答案 什么是“初次分配”,什么又是再次分配?如题 研磨根用什么样的工具好呢? 把下面句子变为否定句1.Park your bike in front of the classroom building.___ ___ your bike in front of the classroom building.2.Play basketball with your friends on the stree.___ ___ basketball with your friends on the stree.3.Be late for cl 3公斤干粉灭火器有多高直径是多少? 小蝌蚪是怎样变成青蛙的,画一画 将下列句子改为否定句1、The boys often play in the playground.2、David learns a lot from this book.3、The hot cottee near the clock is for the doctor4、The girl in red studies veryhard every day.5、Stand in a line.6、She usually watche 3600平方米的瓶级聚酯切片仓库该配备多少8公斤干粉灭火器 空着的如图,(1)OP是角MON的角平分线,C是 OP上一点,CA垂直OM,CB垂直ON,垂足分空着的如图,(1)OP是角MON的角平分线,C是 OP上一点,CA垂直OM,CB垂直ON,垂足分 别为A.B,三角形AOC与三角形BOC全等吗,为什 将下列句子变成否定句:1.We go to evening school at night.2.My brother works in a radio factory.3.Her name is Mei Ling.4.You have a red pencil.5.She has lunch at home.6.We have a meeting once a week.7.She has lunch at twelve. 伽利略在说明利力不是维护物体运动的原因时,用的什么科学方法 增强的近义词和反义词 如图,正方形ABCD的边长为20CM,点E在边CB的延长线上,且EB=20CM,点P在边DC上运动,EP与AB的交点为F,设DP=x CM , △EFB与四边形AFPD的面积和为y 平方厘米,则y与x的关系式为 三条直线AB、CD、EF相交于点O,如果∠AOD=3∠FOD,∠AOC=2/3平角,求∠AOF和∠BOC的度数 已知:如图,OP是角MON的角平分线,C是OP上的一点,CA垂直OM,CB垂直ON,垂足分别为A,B.问角BEC与角OD 正方形ABCD的边长为10cm,点E在边CB的延长线上,且EB=10cm,点P在变DC上运动,EP鱼AB的焦点为F.设DP=Xcm,(接上面)△EFB与四边形AFPD的面积和为ycm²,求y与x之间的函数关系式(要有步骤) OB平分∠AOC,OE分∠AOC成2:5两部分,∠BOE=27°,求∠AOC的度数OB平分∠AOC,OE分∠AOC成2:5两部分,∠BOE=27°,求∠AOC的度数 "增强"的近义词和反义词增强的近义词和反义词,急 如图,正方形ABCD的边长为8,点E在CB的延长线上,EB=4,点P在CD上运动(C,D两点除外),EP与AB交于点F,若CP=x,四边形AFPD的面积为y,求y关于x的函数关系式(要有过程啊!) 干粉灭火器对人喷好吗 OP为∠MON的角平分线 点C在OP上 CA⊥OM CD垂直ONOP为∠MON的角平分线 点C在OP上 CA⊥OM CD垂直ON 垂足分别为AB 求线段AB与直线OP的关系. 在四边形ABCD中,AB//CD,AB=CD,E在CB延长线上,且EB=BC,DE交AB于F,求AF=FB 用线挂一个重物做匀速圆周运动,线长易断还是线短易断?为什么? 当两个相同的物体摩擦时会起电吗快利用一些容易起电的同种材料进行相互摩擦,两个摩擦表面就能够出现带电现象。通过进一步的实验表明:两个表面所带电荷为同性电荷,并且有的材料 如图所示,已知∠MON,OP为∠MON的平分线,在OP上任取一点C,过点C作OM的垂线,垂足为E,垂线为CE交ON于B点,过点C作ON的垂线,垂足为F,垂线CF交OM于A点.问AC于BC相等吗?请示说明理由. 已知直边和15°角求斜边(计算方法) 两个相同的物体摩擦后为什么会互相排斥?我们老师都做了实验,两个相同的物体摩擦后确实会产生排斥,因为我在加拿大,我们i老师解释是用法语,我不是很明白,所以想问问各位大神, 有什么好的动物学的入门书籍要动物学的,最好是哺乳动物.可以的话,再推荐一些天文学的入门书籍,呃,一楼那位,你推荐的第一本书是动物学的吗,能给个中文的书名吗,看不懂的说~二楼,是动物 直角三角形求斜边长度.请告诉公式和计算方法拜托各位大神直角三角形,已知底边长2.7米,高2米,求斜边长度.请告诉公式和计算方法,还有答案 明治维新的积极,消极影响,以及评价,后人影响.求 对历史有爱好的人士更好,最好可以结合中国当代说下,搞笑的说说.其内容如果能安排在10分钟~好的话会追分滴!能的话 结合更多的课外知识 有哪些非常棒的动物学系列书籍?现在有哪些编的内容齐全,版式又好的关于动物的书籍?最好是有关脊椎动物的! 双翅摩擦发声的有那些 海洋动物有那些不吃人也不伤人,还有会救人 请大家推荐一本好的有关于《动物学试验》的书(适用于初学者), 能和可口可乐发生剧烈反应的糖具体是哪一种?商品名?中国到处都买的到的? 什么动物是人最早训练的 独立费与税前包干费、税后包干费的区别 蚱蜢用脚摩擦翅膀来“唱歌”,请问是通过蚱蜢的什么振动,导致发声? 势能与密度的关系? 包干费是什么意思 华太油烟机质量怎么样使用寿命长不长?做工好不好 怎样的情况下会产生“双性恋”?“双性恋”的人,有什么特殊表现?如何纠正“双性恋”心理? He and I are fine,thank you. 可乐与什么糖果混淆会发生反应?我看电视时,一瓶可乐和糖果接触,结果可乐飞上天了!问那是什么糖? 我怀疑自己是双性恋,怎麼辨?双性恋是心理还是生理,基因影响的? 日本明治维新的内容 外媒:美国债务乱局给中国敲响“警钟”澳洲林火因澳部队实弹演习引发 强风致2014年德国机械制造领域预计将长增欧亚经济最高理事会会议召开 乌克兰入金正恩成马来西亚高校荣誉博士 为表彰李娜两连胜好假期可期:两情绪交错既兴朝鲜举行第4次连长连政治指导员大会 女子洞房时发现丈夫并非意中人 认命婚一辆载着300万货物货车高速金华西出男子向已婚女子表白被拒 生气骑摩托车费德勒巴塞尔赛继续抢分 直接对手相继美国就土中军贸再搞“小动作”白宫网页万人请愿 辱华节目被删除日本明治乳业退出中国 竞争激化成本上杭城遭遇八面“霾”伏 PM2.5为中杭州诞生“黑白配”羊驼 被称羊驼中的打破行业“潜规则” 温岭取消抵押贷款宁波市财政每年新增资金3000万元扶少女被人勒昏剪掉双侧乳头 嫌疑人自称男子住宾馆强奸隔壁女子后回原房间睡觉十八届三中全会前瞻:三大焦点构建中国金价维持高位震荡本周晴多雨少活禽不能带上城乡公交年龄不是问题,进球才是王道是什么在大脑里掌控我们的睡与醒咱就领块绿地“义务养树”钱江源头,明朝更好看做大丰收小额贷款卡惠农品牌联合利华联手宁波沁园村美民富奔小康习近平电晤默克尔欢迎默克尔今年访华浙江代表提出议案42件探索微贷新技术 办贷只需10分钟微信监督河道环保扶持时尚品牌走出去金华农信存款增量开门红广袤田野谋蝶变凡属重大改革都要于法有据电商征税·快递安全·打车软件推进农业现代化建设创新的饕餮盛宴
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘