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

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

编辑:说三道四文库 发布时间:2017-12-14 04:30
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;
    }
将会出现iCar?苹果应该收购特斯拉的七大原因 广大程序员的福音:Bing Code Search扩展助你方便查找代码 深挖线下价值是当前婚恋交友网站获取盈利的突破点 15个最好的Bootstrap设计工具推荐 Google首席软件工程师Joshua Bloch谈如何设计一款优秀的API【附PPT】 Webix 1.5发布:一个强大的JavaScript UI组件库 四大著名风投:在我们眼中只有技术革新 美女CEO谈AWS:是香水还是毒药 国外一学生发明新计算机系统,用微芯片代替硬盘 《近匠》第12期:Yeelink——智能硬件云服务 三星Galaxy S5:home键内置指纹识别传感器、5.25寸2K屏幕 Google发布Google Glass使用守则 三星将发布新款智能手表 搭载Tizen系统抛弃Android 从Camera360 V5版本发布,看现代相机应用趋势 索契冬奥会API:赛事的数据直播 为什么开源企业的开源大旗正在褪色 尘埃落定 腾讯确认投资大众点评,获20%股份 Unite China&#183;2014:上千Unity开发者狂欢、五大精品课程全面开启 下载4万首歌曲仅需几秒——蓝色巨人IBM发布新传输技术 15核芯片+数据平台,Intel软硬兼备的Hadoop战略 Facebook以160亿美元收购50名员工、4.5亿月活跃用户的WhatsApp 2014年全美最吃香职业TOP100,程序员排第一 LinkedIn向所有用户开放博客发布平台 Google与Facebook的产品研发之道 小米海外扩张第一步 红米进军新加坡 Google I/O大会时间已定,Google Glass真的来了? 精英团队PK全能型数据科学家,拼的可不只是数量 专攻移动支付?PayPal将面向全球开放移动SDK CoconutKit:iOS开发必备的开源组件库 个人隐私是如何“泄漏”的:国内外互联网企业隐私策略对比 惠普2014年Q1财报:净利润同比增16% PC业务逆势好转 一个简单的问题,急! 为大家吐血献上:余世维《成功人士讲座》录像 Tomact设置问题 很简单的“异常”问题 linux vi的绝对路径是什么? 为我即将离开PB和IT行业,散分! 今天是中秋节,还是单身的水友进来坐坐。 哪有Crysrept下载?? Session为什么掉了??急切等待!!! struts中一个页面如何显示多个FormBean? 过节了,散分,祝大家中秋快乐!!!!!! 請問TForm中相當於MFC中OnIdle()的event是什麼 数据库问题,急!!急!急!急!急! CISCO2600的ISDN拔号不会自动断线,怎么办? 谁知道怎么验证一个用户名和一个密码是不是在WINDOWS2000中添加过的?而且正确? 。。。谁能给我发一个“智能狂拼2”的下载连接地址 请求--网页评比规则? 在visual.net上无法调试存储过程。急。求救 asp加密程序 我用SQL server+DElphi中的ADO做数据应用程序,数据库备份后,怎样实现数据库的恢复? 贴子太多了,看不过来了,大力liuri出来讲讲 sqlserver 用 jdbc出错 ,Microsoft][SQLServer 2000 Driver for JDBC]Error setting up static cursor cache 如何在C#中用代码控制本地FTP服务打开和关闭?99分,中秋快乐. 关于dll的问题,在线求教 昨晚,我抱了我MM一下!开心呀!散分! 有什么软件可以使上网不受防火墙的限制? 一个C的图形函数,请问怎样用的? 数据库查询语句执行错误 web页面的activex控件怎么调用服务器上的动态连接库?? 中秋散分 【泰坦】祝大家中秋节快乐!(1) 纯jsp聊天室的页面刷新问题 这个MSDN是不是常说的那个MSDN资料库? 一句sql语句问题 【泰坦】祝大家中秋节快乐!(2) 我的触发器为什么没有响应啊。在线等啊 pb9.0+sql server 2000,怎样制作程序发布? pb给dll传递结构数组的问题。急!!! pb9.0+sql server 2000,怎样制作程序发布? 为什么关闭MSDEV的时候,会导致它占用90%以上的CPU时间??? 如何在代理中同時讓兩個套表同時結案 菜鸟问题:我想把一个CString类型转换成LPBYTE类型应该怎么弄? 如何在JRUN3.1中连接SQLSERVER, 我的web server用的是IIS5 怎么样在JSP中显示 WORD 或 WPS 格式的文件? 如何在servlet 中存储数组用javabean 取数组用JSP显示(在线等,急,谢谢) 如何使Response.Redirect "xxx.htm"打开的网页是满屏显示! 鄙视民工的人,给你讲个故事听。 庆祝中秋佳节,大散分~ 中秋节到了,与大家同庆,散点分!!!祝大家开心呀! VC的bug!!! 游戏、网络、图形等版块正在整顿中,有意见或建议欢迎提出!! ail@maii.com这是什么?如题 ail@maii.com这是什么?什么类型邮件? 关于生物实验题,不单只要答案 还要详细解析利用如图装置测定某植物光合作用的强度,请分析回答有关问题(注:A为开关;B为玻璃罩;C为转基因植物;D为烧杯,内装NaOH或NaHC03溶液;E为红墨 exam 和examination的区分 为什么不选择ABC? 求详解,一道高中生物有关细胞实验题, 有15个成员国的组织开会,其中包括英国、中国、法国、俄罗斯、和美国,如果在会议上所有的成员国代表都随机坐下,请问英国和法国的代表坐在一起而俄罗斯和美国的代表不坐在一起的概率 统计学问题:一组数据排序后如下 3 4 9 9 9 10 11 11 12 14要求:(1)计算这组数据的众数、中位数和平均数(2)根据定义公式计算四分位数(3) 计算这组数据的标准差 请问邮件上说的什么意思 abc后面3个 现在的中南海中谁是左派谁是右派 左派是什么意思 两岸企业家紫金山峰会南京开幕新加坡政府提高警惕应对黑客威胁俄罗斯庆祝“人民团结日”日本一体育交流团体在朝开设代理事务所马来西亚绿色植物在国土面积中占74%缅甸政府首次与多支少数民族武装组织集马来西亚绿色植物在国土面积中占74%印度北部发生火车撞人事故造成4人死亡伊朗总统说对核谈前景不乐观南非一村落“自助打黑”烧杀6人中国驻坦使馆谴责不法分子走私象牙行为图片新闻易思玲:我尽力了“首金”是怎样一块馅饼女生出租屋床底每天发出霉臭味 真相竟夏令热线|浦星公路无证摊贩绵延几公里人约立秋时:贵州少数民族谈情说爱立秋长发女子“盘踞”商场楼顶 原是鬼屋宣广西队遭遇“黑色一夜”现代奥运会首次造访南美洲电视直播表实力+颜值 宁泽涛或出战男子4X10全职真仙月弯弯兄弟之友情岁月灵魂收割者邪魅冷少的替身妻天浴时空骇客仙戮佛屠校园美女同居悠悠田园香校草的合租恋人安康水电站大坝旅游思源广场旅游佛手山风景区旅游邓小平纪念园旅游状元桥旅游市立美术馆旅游麻田旅游邓小平太行山旧居旅游麻田八路军总部纪念馆旅游题扇桥旅游青朴旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘