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

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

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;
    }
从三大运营商联手 看电视游戏背后的现状 【工具推荐】Vert.x——非阻塞、高并发的编程开发框架 Google搜索在确定结果排名时会将网站的移动设备适用性作为考量因素 W3C首次发布SVG标记、SVG轮廓标准工作草案 第七届中国云计算大会 | 首批主会演讲嘉宾和议题公布(表) 安沃传媒创始人王旭东:开发者从移动广告获利的黄金时代已经来临 【舌尖上的CTO】砂锅馄饨的交付件 微软新Visual Studio Code开发工具支持Mac和Linux 科技新创公司想做大?从CNN记者跳槽Snapchat谈起 Java二十年特别奉献:晒博文、赢大奖! 《近匠》华为创新总监蔡绪鹏:智能手表的三大感知与未解难题 从Samurai-Native框架开发谈React Native Qualcomm公司李申:Vuforia打破AR设备界线 物与物的互通:解析Thread、AllJoyn、OIC、Bonjour的特点 《天龙八部3D》中Unity使用介绍 微软推出ManifoldJS,Web App自动转成各平台本地App 专访庄晓丹:Java程序员眼中的Clojure 全面解析ECMAScript 6模块系统 七牛技术总监陈超:记Spark Summit China 2015 Project Tungsten:让Spark将硬件性能压榨到极限 Android手表在中国这样落地 ART运行时Foreground GC和Background GC切换过程分析 开创未来的关键:是什么造就了硅谷?(上) 微软前员工:开发Apple Watch应用的27个技巧 Apple Watch应用开发:从再造墨迹天气谈起 Java二十年特别策划:有奖征文,评选结果出炉! Zen=禅道:图解AMD技术战略转型 从友盟微社区看Android第三方SDK架构实践 无创客 不青春!2015全国大学生移动应用创新大赛在京启动 响应式Web开发,必懂媒体查询(系统理论+实战教程) 实例剖析:如何用Foundation For Apps创建完美Web应用 给分!!!!!啊 给分!!!!!啊!! 给分!!!!!啊!!!!!! 给分!!!!!啊!!!!!!!!!!!!! 给啊!!!!!!!!!!!!! 不是俺蓄意谋两位帮主的反,实在是 ... APPLET连接数据库。。。(我已经每粉了) 千分散尽不复来!!! 千分散尽不复来!!!! 千分散尽不复来!!!!! 千分散尽不复来!! 千分散尽不复来!!!!!!!! 千分散尽不复来!!!!!!!!! 千分散尽不复来!!!!!!!!!!!!! 用分把灌水乐园咽死!!!!! 千分散尽不复来!!!!!!!!!!!!!!!!! 千分散尽不复来!!!!!!!!!!!!!!!!!! 千分散尽不复来!!!!!!!!!!!!!!!!!!! 千分散尽不复来!!!!!!!!!!!!!!!!!!!!! 千分散尽不复来~ 千分散尽不复来~! 请教数据窗口的问题 千分散尽不复来? 千分散尽不复来?! 有LVS_OWNDATA属性的CListCtrl 加图标的问题,25分 在做会员注册时,在添加新数据页,程序一运行就在RS.updata出错,为什么(原程序) 高手请你回答我啦!!!! 我要回家了,第一个给300 哪有msproxy下载????? 请问要怎么样才能在自己写的程序运行时让用户无法使用开始菜单? jdbc的版本 发分!!!!!!!!! 对于初学者,应该学些什么样的数据库? Java的优点 化功大法第一章--散分。 吸星大发第一章--散分 i need help 葵花宝典第一章--散分 求哈密而顿路的算法 我是新手请问下面程序哪错了!为什么提示我有1处错误! ???????????请问怎样将.h连入.CPP中 richtextbox控件的什么方法能实现打字功能 小弟想在假期开始学习PHP不知该从何学起呢? Keyboard stuck key detected 机子启动时出现这样的提示并有F1(设置)或ESC(BOOT) 谁是第100个?!?!?!? :???????????请问怎样将.h连入.CPP中 着火啦!快请来帮帮忙吧!越快越好!!!!! MD,野球拳第一章--散分 那里能搞到Visual FoxPro 写的人事管理的原代码,师弟毕业设计,急需,高分答谢,其它代码也行,只要完整 vb中不能声明动态数组吗? 倾家荡产求购优秀系统分析案例 年龄可以这样表示 30岁 40岁 50岁 60岁 70岁 800乘800等于多少? 3分之22除以三分之四等于? 古代年龄的代称1,二十岁2,三十岁3,四十岁4,五十岁5,六十岁6,七十岁 (200+40)除以4-2= 1除以三分之跟号三等于多少?要详细步骤谢谢了,大神帮忙啊 一个数的80%是40,这个数是多少 一个数是90,它的25%是多少 一个数的50%是40,它的75%是多少甲数是30,它的5分之1与乙数的15%相等,乙数是多少一个数的12.5%是20,这个数的5%是多少一个数是45,它 (1-7/15)x+40=200-x+7x/15.你这里的/表示除以还是? 378*8+21*8+8简算怎们算 一个数减少它的20%后是80,这个数是多少?甲数的25%与乙数的75%相等,乙数是40,甲数是多少? 200+40除40-20,如果要最后算除法,算式应为 ( ) 378*21-378简算 50吨的20%比80吨少()% ()吨比50吨的20%多20% 200+40除40-20,如果要先算加法,再算除法,最后算减法,算式应为 ( ) 378-99用简便计算 25比20多( )% 20比25%少( )% 20是25的( )% 25是20是( )% 30是50的( )% 60是80的( )%去年产粮4吨,今年产粮5吨,今年比去年多产( )%今年比去年多产( )%去年比今年少 按要求在以下一道 200+40÷40-20的算式中的的地方填上小括号1.先算加,在算除,最后减的算按要求在以下一道200+40÷40-20的算式中的的地方填上小括号1.先算加,在算除,最后减的算式是200+40÷40-20 2. 3+8等于几 30千克比50千克少( )%?( )米比20米多30%? 200-200÷20+20,如果要先算加法,再算除法,最后算减法,算式应为( ) 8/3×π×8等于几求啊 一个数增加它的25%是40,这个数是()? 20除以()=()分之36=():60=百分之8 3/8×π×8等于几 如果1等于5,2等于10,3等于15,4等于20,那么5等于25还是等于1 八十分之几=二十四分之几=几分之二十五=八分之五=几分之十=五除以八 8➗8等于几 EXCEL2003中,该列数据中大于或等于90时,用A来表示,在80和90之间用B来表示,70和80之间用C来表示ABC在另一列中显示,这是学生成绩统计.急, ( )除以20分之1=( )除以30分之1=( )除以四十分之一=2 16➗8等于多少 80+12-1等于多少,谢 0.123除以0.15=( )除以15 3×15等于 10+12移动一位数字 怎么能等于 11? 有哪些四位数除以80后小数点后等于0.2 (4/3-15/1×9)÷3/4等于多少? 甲数比乙数的12倍少20,乙数是80,甲数是多少? 哪个4位数先除以80,再减去整数,剩下的小数(小数点后面的数),乘以80,等于1、3、5 【 】除以5分之3减去7分之2乘以10分之7等于5分之2 2,5分之4乘以【 】减去5分之1等于3请问括号里填多少 为什么20岁的女人是足球,30岁的女人是篮球,40岁的女人是乒乓球,50岁的女人是高尔 乙数是甲的80%,则甲数:乙数等于():(),如果乙数是20,甲数是多少? 四个数字,先除以八十,再减去其整数,剩下的小数(小数点后面的数字)乘以八十等于三 求这个四位数字帮忙算一下! 20岁30岁40岁50岁60岁70岁的人在古代各自的称谓?称呼 两个自然数的积是492,其中一个数在20和80之间,这两个数分别是多少? 哪个4位数先除以80,再减去整数,剩下的小数(小数点后面的数),乘以80,等于18 二十岁、三十岁、四十岁、五十岁的女人分别叫做什么啊比如说花样年华啊,风韵少妇啊,或者什么什么的, 两个自然数的积是492,其中一个数在20与80之间,这两个数分别是 有一个四位整数,在它的某位数字前面加上一个小数点,再加上一个小数点再与这个四位数相加,得数是2000.81用方程解得数2000.81,两数相加 中国古人分别称10岁、20岁、30岁……是什么呢?就是而立之年、花甲啦…… 两个自然数的积是492,其中一个数再20与80之间,这两个数分别是多少?最好是用五年级的水平来回答! 一个四位数,在它的某一位数字前面加上小数点,在于四位数相加,得2000.81,这个四位数是多少 50,60,70,80,90岁古代语叫什么,比如30岁叫而立,40岁叫不惑? 两个相邻的自然数之积是1980,这两个相邻的自然数是.帮偶 按周易81理数 算手机号吉凶 我的尾数是1280 除以80得16 到底是吉还是凶 古代称男子20为___之年,30岁为____之年,50岁为____之年,60岁为____之年,70岁___之年,100岁为____之年 八十加八十等于多少? 第44页49÷7可以读作(四十九除以七),也可以读作(?). 我国传统把三十岁称为什么 80毫米等于几米 (0.48*0.49*1.5)除以(0.05*0.24*0.7)
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn