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

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

编辑:说三道四文库 发布时间:2017-08-18 01:14
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;
    }
Android标题栏TitleBar全攻略 AsyncTask实例代码演示Android异步任务 重绘TextView类演示Android的Handler Android的SoundPool类使用与利弊 AsyncTask解决Android UI堵塞问题 Android自定义View实例AnalogClock源码 Android UI开发专题(五) Bitmap和Canvas实例 Android UI开发专题(四) View自绘控件 Android UI开发专题(三) 各种Drawable 提高Android开发效率-Eclipse快捷键大全 Android UI开发专题(二) 之绘图基础 Android UI开发专题(一) 之界面设计 Only the original thread that created a view hierarchy can touch its views的相关 Android上的Back键事件捕获 Android蓝牙API之BluetoothSocket类(2) Android蓝牙API之BluetoothSocket类 Android蓝牙API之BluetoothAdapter类(1) Android蓝牙API之BluetoothAdapter类(2) AndroidManifest.xml文件剖析 (三) AndroidManifest.xml文件剖析 (二) AndroidManifest.xml文件剖析 (一) MOTODEV初体验,高效Android开发工具 Simple让BASIC语言编写Android程序 MOTODev试用报告- Android开发效率之源 安装MOTODEV Studio for Android版方法 Android开发工具-motoDEV studio介绍 Android过后Chrome OS又是如何开发? Android安全模型导致开发时功能受限 Android导出一个JAR库 APK汉化原理及方法 APK文件格式分析,Android反编译入门(一) 100分求购最简单的串口程序!需要详细注释! 怎么给大家份呀?to wyz_csdn等(500分诚征wav 转换到MP3的源程序(VC++的例子)) 在directshow中,不知道怎样对播放的画面的亮度进行控制? 如果深愛的人要離開你,是變心還是死亡好一點?(讨论) 贴了二次为什么没有人指教? 戒水快两年了,如今回来看看,物不是人非啦 新手一问 关于datagrid 修改数据的问题,帮我看看,多谢 谁有这两本书,请帮忙发到我的邮箱里,100分相送 到底应该怎么办? 大家好,如何打开DLL文件? 建议成立一个程序员协会 关于IE中图片的保存 VB 语言支持问题 高分求李维《delphi5.xDELPHI5.X ADO/MTS/COM+高级程序设计》示例源码!!!! 请yangshu进来!给妳点分!!!倒分! 请教各位如何实现dbgrid中按住shift多选的问题? 请问把sql-server7中的数据文件copy出来行吗? 找不到类,请大家帮忙解决,谢谢 异常处理问题 怎样恢复被损坏的"本地用户和组" 小弟在线等待,一小问题,,大家来帮忙?? 求jsp树的原代码 最好是jsp+js+xml 执行效率要高。(从数据库中动态生成的)在线 关于多层结构中事务处理的问题. VB6.0升级到VB.NET的问题。 在ASP中使用ActiveX Control ADOTable表名如何在运行时“递进” 这样的待遇能招到人吗? 不好意思,问个技术问题。其他版实在没人气!只好来这问! 不爽,辞职,散分! 在线等待(100)往一个表的字段赋值,怎么不行啊! 急!在线等待! 如何把一个窗体内嵌到另外一个窗体的指定位置? 电源键设置问题 假设有一个变量CString str,调用str.GetBuffer(ncount);上面函数的参数应该为多少,才能取得缓冲中的全部字串值? 如何做局域网中的机子通讯 有关Enumerations的问题 请教英文语法检查的算法. 给些提示或参考资料好吗? 简单的关于对话框关闭的问题 关于新闻联播! 哪位有USB1或2.0的开发文档或相关资料? 关于JAVA的问题!请教高手~! 在delphi中用什么样的函数可以将十六进制数转换成十进制? 在MotoSDK3.1的moto388c上模拟正常,但换成T720出现严重问题。 开发“办公小助手”,我准备用VB开发,各位给点思路! 在2000下telnet到Solaris机器,c++编译的问题 droplist 女人啊女人 无法进入系统了,请大家帮我看看怎么回事。谢谢! 如何通过串口来读写数据? 急!想要得到机器安装的物理内存数量!最好还能得到锁定的内存数量! 梦到收大米会怎么样 如何办理易制毒证 嘉靖皇帝是如何死的? few hours left till the sun's gonna rise的意思及语法现象,特别是be gonna(即be gone to )的 如何有效易制毒胶囊类似事件发生 嘉靖是位有争议的皇帝吗?谈一谈他的功过是非.央视《大明王朝》,对他是褒还是贬? 老师让背古诗,没背过,罚写检讨书500字 国家规定的易制毒化学试剂有哪些 在那里能看投明状朋友们告诉我一个地方,看看这个. 类比推理 官渡之战;赤壁之战 选择A淝水之战 ;柏举之战 B桂陵之战 ;马陵之战 C长平之战 ;长勺之战帮我选择一个答案 请问国家规定一类,二类,三类易制毒都包括那些品种请提供具体品种 就是说一个明星要连投, 大米英语怎么写? 太阳是月球的许多倍The sun is __ __ __ __of the moon在横线中填单词 臭味相投的投是什么意思 1.司马懿面对空城和焚香操琴的孔明,未见前(),见到后(),最后() 2.诸葛亮城头操琴笑容可掬的笑,反映了诸葛亮1.司马懿面对空城和焚香操琴的孔明,未见前(),见到后(),最后()2.诸葛亮城头操琴笑容 涿鹿之战 交战双方是谁 还有桂陵之战 巨鹿之战 肥水之战 牧野之战 马陵之战 官渡之战 W______ is bigger ,the sun or the moon?这道题目是根据句子或对话意思及首字母提示补全所缺单词 将白糖打在生鸡蛋里会有毒吗? 继续提问,大学英语4选择题,1、-Can I help you with your luggage?-____________________________.AThank you.I can manage it myselfBNo way.I can do it myselfCNo,I don't need your helpDYou do your things,please 2、-May I help you,madam?- ______ Which is larger,the sun________the moon?A.so B.but C.and D.or 鸡蛋有毒吗? 28._______was the day before yesterday.A.France's Independence Day B.Day of the French independence C.French's Independence Day D.The France's Independence Day 29._______you've been looking for.A.Are here the papers B.Here are the papers C.The papers 关于文言文:唐太宗论治天下解读本文的两个关键字是:___ ___选自_____(朝代)______(人名)主编的______(书名),它是___(体史书). 铜盐在燃烧的时候,火焰为黄色.这是正确的吗? 初二物理题(3题填空题)1.如果声源每分钟振动600次,那么它的频率为_____Hz,人耳_______(能,不能)听到这声音.2.物理学上为了比较物体运动的快慢,引入________这个物理量.3.超声波在15°C的空气 后出师表作于蜀军第一次北伐失败后,大臣们对再次北出征伐已颇有异议,但文中却一再提及曹操之败,又言先帝之败,只是为什么 食盐细粒在炉火上灼烧发出黄色火焰是什么反应 碳碳双键能在最旁边的两个C上么?就是C-C-C-C-C-C 能在第一个C和第二C之间吗?若不行,为什么呢? 太阳快下山天也暗猜一成语 把食盐撒向火焰,看到火焰变黄了,是不是因为焰色反应? 有机化学碳正离子的α-C-C旋转是什么? 为什么有时晚上八点太阳早已下山但天还是红的?照常理来说太阳在六点左右已经下山,天早就应该黑了,但是这时的天却很红和以往完全不同,直到晚上八点半天才变黑? 曹操的《让县自明本志令》中的“让县”是什么意思?如题. 伞布料有毒吗 我们的太阳ds中如何变天气迷宫中如何变换天气?有一个像石像(木乃伊?)一样的人不管咋么打都没效果,跟各种心灵兽打都没有效果,难道变天气就一定要到研究所去变?还有,暗黑城一开始冰区域 谁有曹操的《让县自明本志令》?有的话把全文复制来看看…… BaCO3转化成Ba(OH)2 Ba(OH)2转化成HNO3可加入多种物质多次转化 Sunflower is always toward the sun.but the sunflower will be tried sometimes.Till The sky was dark,急Sunflower is always toward the sun.but the sunflower will be tried sometimes.Till The sky was dark,the world is gray,Sunflower no more see the sun.. “曹操孟德”是什么意思 ba(oh)2和hno3的化学方程式和离子方程式 《中国小说史略》到底是白话文还是文言文写的啊 如测量电阻要求误差小于万分之五,电桥灵敏度应多大? 少量Ba(OH)2与HNO3反应方程式 《社戏》 - 鲁迅 文言诗文点击中的一道题《社戏》 第十段的动词运用准确、生动,如:“点、磕、驾”等写出了双喜这帮少年驾船技术的高超.请用80至左右写一段有关某项活动的话,表现连贯 故以四时归乡里,出自曹操的不需要全文翻译“故以四时归乡里”,“以四时”做何解,整句话的本来意思,逐字翻译 西北地区外墙保温材料都有那些种类? 诸葛亮《后出师表》中今贼适疲于西中的贼是指什么 说曹操骂曹操不见曹操想曹操是什么意思? 医用脱脂棉上哪儿去买? 天气为什么会变凉? 下田割稻子要注意什么? 大家帮我看看我给仓鼠买的脱脂棉对不对、谢了这个是整块给鼠鼠还是撕碎? 急求《治天下必先正心》的译文!...贞观初,太宗谓萧瑀曰:“朕少好弓矢,自谓能尽其妙。近得良弓十数,以示弓工。乃曰:‘皆非良材也。’朕问其故,工曰:‘木心不正,则脉理皆邪, 请问个割稻子有什么好的方法,天气太炎热了. 文言文“安有说人主不能出其金玉锦绣,取卿相之尊者乎”的现代汉语翻译 易制剧毒化学品可否快递 电桥法测定中低值电阻误差分析大学物理实验误差分析 易制毒是什么呀?易制毒是什么? 易制毒化学品和剧毒化学品的区别?请给我一个详细的答案,答案满意才能给分? 棱镜门记者称自己必将返回美国 绝不因快车道上驶来雪橇车:老人驾车三只狗狗南京:学生上“普高职高融通班”可读大南京一男子酒后开车连撞5车被判缓刑南京六合区一农民因焚烧秸秆被治安拘留南京博物院耗资千万建成文物“医院”(穆尔西审判或引新流血冲突 当局似已胜国际新闻早报:土耳其出动战机拦截叙利Netfix测试4K超清视频 或于明中马友好合作关系不断向前推进--访中菲报:中国海基核威慑仍受制第一岛链克里中东之行访埃及 停留数小时修复两美国务卿克里访问埃及 承诺美将与埃过伊朗最高领袖称美是微笑的敌人 对核谈美研发新型间谍机 可一小时内到达全球泰国芭堤雅发生游船沉没事故 造成中国如何确保机密数据安全?把密码藏在潜意港媒:设计师为《人民日报》新大楼辩护中国如何从西方垃圾中获益港报:“伙伴关系”成中国重要外交工具浙江普陀山大型翡翠观音宝像开雕(图)这部小说“堪比现代活化石”上海名称考首届全球南开校友会会长论坛举行艺术双月展“艺术围城”在福州开幕 1陕西依托航空枢纽全力打造空中丝绸之路宁波诺丁汉大学开办十年 七成毕业生升报废车转卖一天后撞死人 法院判定原车安徽:管理创新论坛在合肥举行(图)孙春兰率中共代表团访问德国:继续加强台大“鬼屋”活动 反思被霸凌者心情确保我在越企业和人员生命财产安全分配向京津冀适度倾斜刘翔计划明年复出人民党赢得大选 莫迪将任印总理黄某波嫖娼事件追踪我省多地入选避暑旅游名城近年来全球军机坠毁事件载有国防部长等高官“牛栏江暂停供水”追踪盘龙江上游已干今年将出方案环保部公布74城空气质量
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘