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

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

编辑:说三道四文库 发布时间:2017-03-27 07:04
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;
    }
11月份浏览器市场份额 IE10已占据0.51% 亚洲高科技公司正在分享惠普、戴尔和IBM的云“午餐” Groupon创业启示:进军海外,请三思 天才之为责任:Unity CEO谈论Unity 4.0游戏引擎 中文版Evernote百宝箱上线:开发者海外推广新渠道 360产品被爆收集用户隐私 桌面安全路在何方 销售额达一万亿元 阿里巴巴成世界最大电商 共享软件海外营销策略与实战分析(武汉站)成功落幕 你未必知道的CSS故事:揭开leading的面纱 2013年 影响Web发展的5类API 《Warcraft是怎样炼成的》:多人对战、战争迷雾以及AI HBTC精彩回顾 Hadoop专家分享大数据技术工具与最佳实践 苹果iTV规格泄露:iOS应用开发的新蓝海 Facebook觊觎微信鼻祖WhatsApp,但谈不上收购 首款社交API应用 Facebook Messenger for Firefox正式上线! 共享软件海外营销策略与实战分析(沈阳站)成功落幕 移动之伤:为什么山寨游戏比原创更火? IBM在京发布PureData 主打数据交易处理、操作分析 Intel发布Hadoop免费版 全力拓展生态圈 突出图片搜索:微软向测试人员开放Socl社交搜索 豌豆荚创始人:和巨头竞争,我们拼产品和技术 “互联网女皇”报告解读:智能电视大趋势 苹果扩大其北卡罗莱纳州燃料电池发电场规模 Oracle回收站使用全攻略 微软这次很诚实:IE真的糟透了 Facebook进军短信业务,挑战微信鼻祖WhatsApp 从菜鸟到专家的五步编程语言学习法 亚马逊企业文化:从书贩到云服务巨头的催化剂 明年Google I/O大会日程敲定 或发Android“酸橙派”? 绝境求生,WebOS寄望Android Facebook在移动路上走过的那些弯路 谁知道有没有创建Service的好工具? 谁来介绍一下CORBA ? 请教ODBC SQL中 CONVERT的用法? 笔记本电脑开不了机!!!! 关于ClientDataSet SQL动态参数的问题? 关于在PB的script中直接嵌入SQL 单机使用什么数据库最好! 怎么远程启动一个程序? 一个XSLT的小问题 C++Builder高手回答!!(关于在NOVELL上的应用) 急!请问哪位高手知道怎么用VB来开发组态软件。请多提提建议! 大家好!~新人来了!~ 如何实现MicroHelp即状态栏的分段 麻烦各位介绍几个有SCJP模拟题的网址!谢谢!!!! 关于Read&Data! 现在只能显示最新的120篇,能不能家多点呀,例如最新1000篇? VS.net哪里有正式版的下载呀?大侠们有没有地址呀? 谁能告诉我哪儿有TR下载,不是TRW,谢谢!50分相送~ 求助!!急!急!…… console下可以用ado访问sql server数据库马? 诸位仁兄,帮小弟推荐一本学J2EE的书。 DataModule4.ClientDataSet1.Locate的问题求救! NetLocalGroupEnum 如何使用列举远程用户 谁有有关游戏开发方面的软件工程文章? 各位大虾有无利用VC打开JPEG(JPG)图像并显示的源代码? 有关单文档多视图的一个小问题,答出有100分可拿!!! 如何优化编译,让编译后的文件最小? 请问软件是vfp3.0写的但是现在只有6.0,能转换么?是否需要重新编译?怎么编译,谢谢 vs.net 在PHP中如何把E_MAIL同时发给两个人? 有关注册表和其他一些问题 正版的vs。net几张盘? 有rtlinux的RCS库开发经验的朋友们 ACCESS能够,为什么SQL SERVER却不能?? 怎样生成新窗口? 有一个按扭,点一下后运行别的exe文件,代码怎么编啊? 请教各位大虾,有关带串口的数码相机的咨询! 有一个按扭,点一下后运行别的exe文件,代码怎么编啊?另外,点一个按扭,使c;\file1的文件,拷贝到d;\file2 有rtlinux的RCS库开发经验的朋友们 100分呀,还有挑战性,一个有点难度的问题,再网格控间上如何添加事件!!! 回答问题有钱给...用ATL创建一个全局COM(只启动一个实例)供所有客户端使用 无助,真喜欢一位小姐(不是那个‘小姐’别误会)真太想知道她有没有男友了,请问有什么办法知道么? 我能过高程么 请教各位大侠,如何简单的实现游戏人物动作的控制? 自己开发了一个软件,用于写jsp是自动生成一些get set 以及连接数据库代码的 问个很简单的问题 简单的问题 假设一个C编程高手首次遇到“sinx=x-x^3/3!+x^5/5!-.....+(-1)^n*x^(2n+1)/(2n+1)!” 各位大虾有无用VC处理JPEG(JPG)图像文件格式的源代码? 谁发给我一张自考的学位证书,我的分全给他! BCB6的5张光盘内容?? 用MG的润滑油对汽车有什么保护作用 应该怎样看待细菌和真菌与动植物的关系呢 铜与一氧化碳反应现象快 细菌、真菌与动植物共生的例子(具体一点,例子一到三个) 手机有什么功能拜托各位了 3Q功能可多了 甲烷细菌属于生态系统 成分,它在生态系统中的物质循环中起到 功能甲烷细菌属于生态系统 成分,它在生态系统中的物质循环中起到 功能 27.5克水中溶解12.5克CUSO4.H2O,达到饱和,该溶液密度为1.21g/cm3,求溶液溶质电离出的阴阳离子的总物质的量 滴有酚酞的稀氢氧化钠溶液中通入二氧化硫的现象是什么大神们帮帮忙 细菌 真菌在生态系统中起什么作用?如果没有它们,你想象地球上会是什么样子? 与动植物共生的细菌真菌是消费者,分解者还是制造者.为什么 向滴有酚酞的氢氧化钠溶液中通入一定量的二氧化硫气体,溶液红色褪去,酚酞退色的原因是什么 再硫酸铜饱和溶液中,是否还能再溶解硫酸铜粉末?为什么? 怎样看待细菌和真菌与动植物的关系 二氧化硫通入氢氧化钠的酚酞溶液红色褪去,说明二氧化硫具有酸酐通性 潜望镜利用了什么物理原理?成什么像? 真菌与动植物共生 在真空中有两个点电荷,其中一个点电荷的电荷量是另一个点电荷电荷量的4倍,他们相距5×十的负二次方米时,相互斥力为1.6牛;当他们相距0.1米时,相互斥力为多少牛,两电荷的电荷量分别为( 潜望镜中的像与物体等大吗? 照相机凸透镜成像性质是什么?...物体放置有什么要求?成像在什么范围?--------------------------------------------------------------------------------------------投影机凸透镜成像性质是什么?物体放置有什么要 在十字路口的摄像头拍下的照片,车外很清楚,却看不见车内的人.为什么?光.人教版八上导航P35.#26题.具体一点 潜望镜是不是物理教具 针孔相机是凸透镜成像还是小孔成像针孔相机的镜头小如针孔,如果用玻璃凸透镜作为镜头,恐怕没有这样的打磨技术和镶嵌技术吧? 十字路口安装的监控摄像头,拍下张照片仔细观察照片,发现车的外表很清晰,但几乎看不见车内的人,因为车内的人( ),摄像头几乎无法成像.夜晚,为了不影响司机开车,车内的灯应()? 物理题潜望镜用潜望镜从B点观察物体,如果物体A距潜望镜1.2m,镜筒长0.7m,则从镜中观察到的像与镜水平距离 关于凸透镜成像原理的应用,投影仪,照相机.补充说明一下,例如照相机的镜头是凸透镜,物体在二倍焦距以外,光屏在一倍焦距以外,二倍焦距以内!投影仪、幻灯机的成像原理还有汽车后视镜应 十字路口监控摄像头和防范的监控摄像头可以储存多长时间的画面 储存后是否保留?请问先在的十字路口或者小路口的防范监控录像 最多可以储存一个多月对吗?储存后所有以前的记录都需要 潜望镜咋做 常温下,在27.5g水中溶解12.5gCUSO4'5H2O.恰好达到饱和,该溶液密度为1.21g.cm.求该溶液中阴阳离子的总...常温下,在27.5g水中溶解12.5gCUSO4'5H2O.恰好达到饱和,该溶液密度为1.21g.cm.求该溶液中阴阳离子的 细菌和真菌在自然界中起什么作用 ω怎么读,表是什么,TFe表示什么 细菌和真菌中一些营_____生活的种类,导致动植物和人患病,但在生态环境中作为_____. 细菌和真菌在自然界中的作用是? 如何制硫酸铜结晶请说详细具体一点,谢谢!P.S.我想做大块的那种..貌似很漂亮的说... 常温下,在27.5g水中溶解12.5gCuSO4-5H2O恰好达到饱和该溶液密度为1.21g/cm3,求该溶液中阴阳离子的总物质的量是多少?为什么求出它的物质的量后还要乘2? 3q可以在手机上同时使用吗? 如何制作制作火柴盒简易照相机(针孔照相机) ,最好有图解! Fe中除Al2O3怎么除 TFT与电阻屏的区别在哪?选择手机时,到底选择哪一种更好呢?3Q 怎样制作最简单的潜望镜如题 用CO和H2合成甲醇的方程式 八年级物理题凸透镜成像的填空~~~在线等!1、_____处是成放大或缩小像的分界点.2、实像和物体在透镜的_____侧,虚像和物体在透镜的_____侧.3、研究凸透镜成像规律的实验中,在离凸透镜18cm的光 如何利用凸透镜制作简易照相机 关于凸透镜成像的经典题目,要有一定的难度.最好是作图题. 1.当烛焰离凸透镜40cm时,在凸透镜另一侧的光屏上可得到一个倒立的、放大的实像.该凸透镜的焦距可能是( )A.50cm B.40cm C.30cm D.10cm 夜晚,几乎看不见车内的人,但车的外表却很清晰,因为车内的人( ) 透镜(凸透镜、凹透镜) 作图: 透镜 作图: 一氧化碳能使澄清石灰水变浑浊吗?如果能,请给化学方程式 观察照片可以发现,几乎看不见车内的人,当车的外表很清晰,是因为车窗玻璃不透关,摄像头几乎无法成像 这句话哪里错还有 监控图象一般通过计算机转化为数字信息储存在计算机中,不需要胶 8年级物理上凹透镜和凸透镜的图怎么画凹透镜和凸透镜中特殊的三条光线经过镜时发生折射的图, 一氧化碳能使澄清的石灰水变浑浊么区别CO和CO2气体最好的方法是 A能否使带火星的木条复燃 B通入澄清的石灰石中 细菌真菌对生态系统的( )有重要作用 将2.5g胆矾溶于160g5%硫酸铜溶液中,所得溶液的密度是1.06g/cm^3 ,求:(1) 溶液的质量分数(2 )溶液的物质的量浓度 摄像头为什么可以很清晰地照到汽车而找不到车内的人是因为车内的人 尽量简短些. 细菌在生态系统的什么流动和什么循环中起到重要的作用? 某温度下,在23.8g水中溶解12.5g胆矾,恰好达到饱和,该溶液的密度为1.21g/cm,求:该溶液中硫酸铜的物质 往澄清石灰水通入足量二氧化硫的离子方程式是什么?. 下列各物质能与石灰水反应但无明显现象的是A一氧化碳 B稀盐酸 一氧化碳与石灰水反应有下列各物质能与石灰水反应但无明显现象的是A一氧化碳 B稀盐酸 一氧化碳与石灰水反应有何现象?石 细菌、真菌与动植物共生的例子答案具体一点...... 二氧化硫通入少量澄清石灰水反应方程式? 生态系统的主要功能
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘