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

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

编辑:说三道四文库 发布时间:2017-02-28 11:27
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;
    }
VB中获取逻辑磁盘的信息 Command & Conquer 文件格式-VB资料 CrystaIReports for VB5报表编程经验 DirectX揭密-VB资料 HOOKS 说明书-VB资料 kb_event函数的使用 -VB资料 MaskEdit 中 9 的问题 -VB资料 MDB文件的导出(使用DAO)-VB资料 PaintPicture的和法 -VB资料 Shell & Wait 的程序怎么写? -VB资料 SHELL语句用法心得-VB资料 VarPtr、StrPtr和ObjPtr函数的用法-VB资料 VB 在ACADWIN中的使用 VB5.0应用程序的启动与退出设计 VB5如何取得CDROM的盘符? VB5三十六计 VB5中确定CPU类型 Vb6.0编程技巧四则 VB6二进制双通道技术实战经典 VB6内置的内码转换功能 VB编程步步高-代码效率篇(一) VB编程步步高-杂类篇(二) VB编程步步高-杂类篇(一) VB编程的必备技巧 VB编程的一些心得 VB编程技巧几例 VB编程经验点滴 VB编程俱乐部问答 VB编程如何控制I/O口 VB编程问与答 VB编程之提速攻略(二) 请问,如何从文件里找出变量. 图形模式? 这段VB程序如何用VC实现啊? 华中师范大学计算机科学系9701班 向建刚 请进! 送分啦——————!怎么在鼠标移动到toolsbar上的每个按钮时现实hint提示?? 帮我一下 我的程序在anywhere中好用,在sqlserver中取出的数据就不对,为空值(我用cursor就这样,用sql语句取出来没错 ) 怎样做一个SCO UNIX 和 NT4 的双操作系统? 请高手编个鼠标移动的小程序,送分 360 。。。谢谢关注 菜鸟求救!!! LoadStr()怎么用? 哪里有制作VCD开始时那个选歌菜单的软件!( 请问在VB里把二进制数据转成字符串的函数是什么?谢谢 紧急求助,各位进来帮我看看!! #####很简单的问题,怎样在EXCEL中冻结窗口 紧急求助,各位大虾进来帮我看看!! 像《金山词霸》、《东方大典》等一样能说(朗读)中文! 屏蔽消息的麻烦………………求助高手 请教高手,数据库恢复的问题! 请问有没有解决d6在win98无法显示帮助索引问题的方法? 请问各位大侠关于COM的问题? 我想用可视化的Java工具VisualCafe,哪里有不限制版?或有正版注册码? 各位,我现在的操作系统是win2k professional 我现在想运行.jsp程序。我应该有什么样的准备。用什么工具做jsp.服务器怎么配置。这些东西都那里去下载。请指点。不胜感激! 急,listbox的columns设置为大于1后,它的这几个列怎样添加字符 一个弱智的问题: 怎样判断实例是否存在?? 再议 在VB中如何创建三层结构的应用程序 紧急问题!Crystal Report是否不支持中文的? 如何得到系统的开关机时间(在WIN2K下)???急 怎么实现这种嵌套的查询结果?(急急求救) 对象的handle,hwnd和指向此对象的指针之间是什么关系??? JavaBean+jsp+Tomcat4.0?把我搞醉了 一个非常棘手的问题,都吃不下,睡不着了,帮忙啊,分不够的话,再开数贴。 高分请问:会跳舞(有音乐)的圣诞老人(玩具,大约有电脑显示屏一般高度)在上海买多少钱,急急急 已有CBitmap m_Bitmap,如何求对应的HDIB 在音乐文件中加入一个代码…… 这种情况下如何用进程条控件? 看了一通sps的sdk,看的我头大的不得了,看来英语还是不过关阿 我要把格林威治平时转换成当地时间用什么函数呢???? 用SQL语句显示记录集中的倒数200条记录,及显示从第几条到第几到的记录?? 问:vb.net采用的是c#,那么在ms.net里面到底有没有visual c#.net??? 高手请进!ADO问题 给我已给在javabean里面使用HttpServletRequest对象的例子好吗?谢谢你了,具体到里面看看可以吗? 在office2000中打印来自matlab53的图形,总是提示word内存不足,word自行关闭。请问为何? 开开关关的窗口 用VC编写操纵数据库方面的COM组件有前途吗? 请问如何将CString中的字符串赋给char* ADODB.Connection问题,急!! 急急! 在javabean里面使用HttpServletRequest对象的例子好吗?谢谢你了,具体到里面看看可以吗? 河南的程序员考试成绩出来了没有?都快把大家急疯了! 一个类的四个问题?this指针等等,欢迎大家的光临。 作息不正常,以及饮食不规律导致的偏瘦怎么恢复 快车和慢车同时从相距1200km的两地相向开出,快车每小时行65km,慢车每小时行45km,几小时后两车相距430km 阿拉伯人种是什么,大多数为什么人? A、B两地相距600千米,一列慢车从A地开出,每小时行80千米,一列快车从B地开出,每小时行120千米两车同时开出 ①若同向而行,出发后多少小时相遇?②若向背而行,多少小时后,两车相距800米?③若两 AB两地相距480千米,一列慢车从A地开出,每小时行60千米,一列快车从B地开出,每小时行65千米.若两车同时开出,相向而行x小时相遇若两车同时开出,向背而行x小时后两车相距620千米慢车先开出一 阿拉伯人为什么有钱 A、B两地相距600千米,一列慢车从A地开出,每小时行80千米,一列快车从B地开出,每小时行120千米.两车同开出.若两车同向而行,慢车在快车后面,多少小时后,两车相距7610千米?对不起打错了是 两车 快车与慢车相距甲乙两地550千米,快车每时行65千米,慢车每时行45千米.两车开出几小时后相遇 AB两地相距300KM,甲乙两车从A地开往B地,当甲距离B地40KM时,乙距离B地50KM,当甲到大B地时,乙距离B地还有多少公里?怎么解 一个圆锥形麦堆,底面周长是31.4m,高是2.4m,如果把这堆小麦放入一个粮仓,只占粮仓容积的九分之二,这个粮仓的容积是多少立方米?各位好汉、美女、8托了! A.B两地相距480千米,一列慢车从A地开出.每小时60千米.一列快车从B地出发.每小时65千米.1.两车同时开出,相向而行,X小时遇,则列方程是—?2..两车同时开出,向背而行,X小时之后,2车相距620千米,则 阿拉伯人属于哪种肤色的人?是白种人,还是黄种人?或者其他 AB两地相距600千米,一列慢车从A地开出,每小时行80千米,一列快车从B地开出,每小时行120千米(1)若两车同向而行,快车在慢车后面,多少小时后,快车追上慢车?(2)若两车同向而行,慢车在快车 你为什么喜欢松鼠在哪些方面? 阿拉伯人属于什么种人 一堆近似圆锥形无烟煤,底面周长25.12m,高是4.5m,这堆煤值多少元?(每立主400元) 已知A、B两地相距600千米,一列慢车从A地开出,每小时行80千米,一列快车从B地开车同时开出.(1)若两车同向而行,快车在慢车后面,多少小时后,快车追上慢车?(2)若两车同向而行,慢车在快车后面 ab两地相距360千米,甲乙两辆汽车分别从ab两地出发相向而行,4h相遇,甲的速度为每小时50km,设乙的速度为x,列方程 一个圆锥形土堆,底面周长18.84m高1.5m每辆车每次可以运5m³土,大约可以运几次 已知A.B两地相距600千米,一列慢车每小时80千米,一列快车每小时行120千米.若两车都按从A到B的方向行驶,多少个小时后,两车相距760千米 甲乙两辆汽车分别从ab两地同时相向而行,已知甲车的速度是乙车的3/4他们在离两地中点的2km处相遇,求ab两地的距离? 快慢两车分别从AB两地相对开出,经过5小时相遇,相遇后两车按原速度行驶,3小时后快车到达B地,慢车距A地180KM.问A,B两地相距多少米? 松鼠吃什么东西 一个圆锥形的小麦堆,底面周长是12.56米,高是3米,现在把这些小麦放到圆柱形的粮囤中去,恰好占这粮囤容积的百分之八十.已知粮囤底面的周长是12.56米,求这个粮囤的高 快慢两车从同一地点同向行驶,慢车先行2小时,已知慢车的速度是快车的60%,快车追五小时后,超出慢车80公里.求两车速度. 松鼠吃食物的描写 《跑进家来的松鼠》中的松鼠有哪些生活习惯 a b两地相距300千米,一列快车从A站开出行驶速度是每小时60KM,一列慢车从B站开出速度是40KM每小时,问[1]两车同时开出,相向而行,几小时后相遇 [2]快车先开15分钟,两车相向而行,快车开出几小时 松鼠怎么吃东西 松鼠它昼夜生活习惯有什么不同 快慢两车同时从A地到B地,快车每小时行54千米,慢车每小时行48千米.途中快车因故障停留3小时,结果两车同时到达B地,求AB两地间的距离. 关于魔王松鼠的食物我家这边的山上有好多的松鼠,非常的惹人喜爱,我想诱捕一只回来饲养,请问松鼠最爱吃什么啊,我用什么当诱饵啊? 告诉我有关松鼠的神态,饮食和生活习惯 一个圆锥形的稻谷堆底面周长12.56m高1.5m,把这堆稻谷装进一个圆柱形粮仓正好装满这个粮仓底面直径2m,求 1、甲乙两地相距240千米,从甲站开出一列慢车,速度为每小时80千米,从乙站开出一列快车,速度为每小时120千米.(1)若两车同时开出,背向而行,经过多长时间两车相距540千米?(2)若两车同时 甲乙两车同时从ab两地出发相向而行,甲车的速度是50Km/h,经过3h后相遇.甲乙两车行驶的路程之比是3比2,问甲乙两地相距多少Km,用比例解决问题. 【求助】求一份每天规律的生活习惯表.好吧,我是一个学生,每天的生活特别不规律,对于自己的时间也是不懂安排,所以来网上求助了.我每天要做的事情就是6点30分起床,8点开始上课,到下午4点 甲乙两地相距480千米,一列慢车从甲地出发速度为80千米每小时,一列快车从乙地开出速度为120千米每小时,1.如果两车相向而行,在他们同时开出xh(未相遇)时,两车相距多少千米? 甲,乙两车分别从AB两地同时相向开出,甲,乙两车的速度比是4:5,当两车在途中相遇时,甲车比乙车少行30千米.求A,B两地的距离. 一个圆锥形的稻谷堆,底面周长12.56米,高1.5米,把这堆稻谷装进一个圆柱形粮仓,正好装满.从里面量得粮 甲、乙两地相距210千米,从甲站开出一列慢车,速度为80千米/时;从乙站开出一列快车,速度为120千米/时.1) 如果两列火车同时开出,相向而行,多少时间可以相遇?2)如果两列火车同时开出,同向 1.一个圆锥形的小麦堆,底面周长是 12.56米,高是2.7米,现在把这些小麦放到圆柱形的粮囤中去,恰好占这粮囤容积的78.5%.意志粮囤底面的周长是9.42米,求这个粮囤的高?(得数保留两位小数)2.一 甲、乙两站相距1200千米,一列慢车从甲站开出,每小时行80千米,一列快车从乙站开出,每小时行120千米,两车同时开出,出发后---小时两车相距200千米?(用方程解)此题为何有两个解(1)x=5.(2x=7 1.甲乙两地相距240千米,从甲站开出一列慢车,速度为80千米/时;从乙站开出一辆快车,速度为120千米/时4)如果两列火车同时开出,同向而行(快车在后),那么经过多长时间快车可以追上慢车?设 松鼠吃什么啊 甲、乙两地相距240千米,从甲站开出一列慢车,速度为80千米/时;从乙站开出一列快车,速度为120千米/时.1.如果两车同时开出,同向而行(快车在后),那么经过多长时间快车可以追上慢车?2.如果两 底面周长1.6m,高0.7m 写公式写出个圆柱的侧面积(写公式)1.底面周长1.6m,高0.7m2.底面半径是3.2dm,高5dm 松鼠能吃吗 推荐一个比较健康的饮食作息表,并说说理由~ 松鼠身上有细菌吗? ab两地相距60千米,甲乙两人分别从ab两地同时相向而行,已知甲的速度为40km,已的速度为30km甲乙两人出发()小时时两人相距40km0.2还是2/7? 月经期间,饮食,生活作息该注意些什么? 某同学在归纳细菌,松树,松鼠的生态系统各层次时列出了下表细胞 组织 器官 系统 个体 种群细菌 具有 具有 不具有 不具有 具有 具有 群 生 生松树 具有 具有 甲乙两车从ab两地相向而行,甲车每时行60千米,乙车的速度是甲车的五分之四甲乙两车从ab两地相向而行,甲车每时行60千米,乙车的速度是甲车的五分之四,经过六分之五小时后两车相遇,AB 怎么做好·体育锻炼+规律的生活作息+合理的饮食+良好的心态我不怎么懂医学,也不懂得怎么照顾自己, 松鼠吃什么的? 一个圆柱形油桶,底面周长是12.56dm,高15dm.如果每升油重0.69千克,这桶油重多少千克 平时作息规律,饮食规律 为什么脸上还总是长痘 细菌和松鼠和松树 西亚的阿拉伯人属于____种人
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn