C与java通讯

java程序和C/C++程序的通讯  摘要:本文研究了数据存储格式中大尾小尾问题,根据此原理解决了Java程序和C/C++通讯及读取服务器端文件时的数据移植问题。问题起源该问题起源于笔者设计的基于Web的远程测控系统。它的基本原理是:服务器端运行一VC编制的服务器程序,客户端使用Java applet;VC服务器程序接收到Java applet发送的命令后,采集各种信息,并将所有数据发向applet,实现了基于Web的远 阅读详情
最近在做java和c的UDP通信,才发现自己的通信基础知识基本为0,汗一个。。不过还好,在大家的帮助下,终于完成了。。下面写下一些小的总结。
(1)字节序问题:这个是通讯的大问题。。前面几篇文章也转载了查阅到的一些资料。总的来说C一般使用的是小尾存储数据,而java使用大尾存储,所谓大尾存储就是数据高字节在前,低字节在后存储。而网络中的数据则都是大尾存储。另字符串在传输过程中不会发生变化,而int,long等数值类型的数据会经过根据大小尾进行存储传输。所以当java与c进行通信的时候,java一段数据基本不用进行大小尾转化,而c收到数据后要进行NToH转化,发送数据的时候也要进行HToN数据转化。再加上字符串,打成包传输即可。
(2)传输包问题:总所周知,传输数据不可能一个字节一个字节发送,没有意义,当然要打成代表一定意义的包进行发送,包就要有包头,包尾。比如下面包的定义:

消息结构

项目

说明

Message Header

消息头(所有消息公共包头)

Message Body

消息体

 

消息头格式(Message Header)

字段名

字节数

类型

描述

Total_Length  

4

Unsigned Integer

消息总长度(含消息头及消息体)

Command_Id

4

Unsigned Integer

命令或响应类型

Sequence_Id

4

Unsigned Integer

消息流水号,顺序累加,步长为1,循环使用(一对请求和应答消息的流水号必须相同)

Version

4

Unsigned Integer

表示,当前网站与AS核心代码通讯的版本号。目前的版本号为:0x0002


消息体如下:

发送请求:

字段名

字节数

类型

描述

AS服务器名称

22

Octet String

AS服务器名称

机构名称

22

Octet String

机构名称

起始日期

4

Unsigned Integer

证书有效起始日期

结束日期

4

Unsigned Integer

证书有效终结日期

 

响应

字段名

字节数

类型

描述

AS服务器名称

22

Octet String

AS服务器名称

机构名称

22

Octet String

机构名称

证书路径

128

Unsigned string

证书在本机存储路径

结果值

1

char

0:解析正确,1:解析错误

 

这样当发送的时候需要把消息头和消息体构建出来,并全部转化成byte数组,再进行传输。
再者对数据包发送的时候,是根据接口文件的。。也就是java和c通讯接口文件,自己定义的了,一致就行。这里面如上面包格式所示,都定义好了每个字段的长 度,那么当读取的时候也要根据这个长度进行读取。那么当实际的长度没有这么长怎么办呢?那就需要双方定义好填充字符,是使用空字符('\0')呢,还是空 格(' ')呢,c里面读取一般遇到空字符就停止。所以使用空字符会比较普遍一些。当java接收到数据后,也要根据找个字符解析出真正长度的字符串。比如使用下面函数去掉后面的空字符:
    private String getRealData(byte[] temp){
        String res = new String(temp);
        int end = res.indexOf('\0');
        String result = res.substring(0,end);
        return result;
    }
而java得到包之后,如何得到每个字段呢,这个没有别的办法了,只能一段一段的拷贝了。下面是我使用的拷贝方法:
private String getServerName() {
        byte[] temp = new byte[22];
        System.arraycopy(this.getRawData(), 1, temp, 0, temp.length);
        String encodeStr = getRealData(temp);
        return new String(Base64.decode(encodeStr.getBytes()));
    }
而c中则使用结构体就可以了。定义好结构体,接受的之后直接接受结构体,然后根据结构体读取,方便快捷,java这方面确实有点麻烦了。
(3)byte,string区别:本来以为传输的时候就是string类型字符串,原来根本不是一回事。网络上传输数据都是字节码,就是我们常说的ascII码的,对应到类型上就是byte类型的。而string只是java中一种对象而已。而且java中编码一般是unicode编码的,要进行和byte类型的转化。int和long类型的也要进行int2byte转化。
接收到数据之后,则要进行byte2int转化。且值得注意的是int转成byte并不是直接字符串的转化,比如123转成字符串就是123,但是转成byte就不是了。它要根据整数123所占的字节,得到每个字节的值,再转成byte数组。常用的转化函数有:
//int2byte
public static byte[] intToByte(int n) {
        byte[] b = new byte[4];
        b[0] = (byte) (n >> 24);
        b[1] = (byte) (n >> 16);
        b[2] = (byte) (n >> 8);
        b[3] = (byte) (n);
        return b;
    }

    public static void int2byte(int n, byte buf[], int offset) {
        buf[offset] = (byte) (n >> 24);
        buf[offset 1] = (byte) (n >> 16);
        buf[offset 2] = (byte) (n >> 8);
        buf[offset 3] = (byte) n;
    }

    // 字节类型转成int类型
    public static int byte2int(byte b[]) {
        return b[3] & 0xff | (b[2] & 0xff) << 8 | (b[1] & 0xff) << 16
                | (b[0] & 0xff) << 24;
    }
//short2byte
public static byte[] short2byte(int n) {
        byte b[] = new byte[2];
        b[0] = (byte) (n >> 8);
        b[1] = (byte) n;
        return b;
    }
// long到byte的转换
    public static byte[] long2byte(long n) {
        byte b[] = new byte[8];
        b[0] = (byte) (int) (n >> 56);
        b[1] = (byte) (int) (n >> 48);
        b[2] = (byte) (int) (n >> 40);
        b[3] = (byte) (int) (n >> 32);
        b[4] = (byte) (int) (n >> 24);
        b[5] = (byte) (int) (n >> 16);
        b[6] = (byte) (int) (n >> 8);
        b[7] = (byte) (int) n;
        return b;
    }
等等,注意:这里只是进行普通的字节码
java与C通讯 java与C之间资源的通讯, java与C之间资源的通讯, 立即下载

相关推荐

Arduino平台软硬件原理及使用——Arduino Uno板卡的使用

Arduino Uno板卡的基本使用

洪博hopes的博客 4172

C与java通讯小结

最近在做java和c的UDP通信,才发现自己的通信基础知识基本为0,汗一个。。不过还好,在大家的帮助下,终于完成了。。下面写下一些小的总结。 (1)字节序问题:这个是通讯的大问题。。前面几篇文章也转载了查阅到的一些资料。总的来说C一般使用的是小尾存储数据,而java使用大尾存储,所谓大尾存储就是数据高字节在前,低字节在后存储。而网络中的数据则都是大尾存储。另字符串在传输过程中不会发生变化,而in

如果可以,我愿争取 854

DSP28335与Vofa+上位机通信实战:SCIb配置避坑指南(附完整代码)

本文提供DSP28335与Vofa+上位机通信的实战指南,重点解析SCIb模块配置的常见问题与解决方案。针对研旭开发板的硬件连接、波特率精确计算、FIFO高效使用以及FireWater协议封装进行了详细说明,并附有完整代码,帮助开发者快速实现实时数据可视化与波形分析,提升调试效率。

weixin_29172963的博客 150

Java与C之间的socket通信

最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App。Android与服务器通信通常采用HTTP通信方式和Socket通信方式。由于对web服务器编程了解较少,而且后台服务器已经采用原始socket实现与c客户端通信,这就要求Android客户端也采用socket实现。所以在开发Android app时采用了原始socket进行编程。 由于算法是用C语言

姚光超的专栏 4万+

[模型部署]-[LLM]昇腾部署Qwen3-Coder-30B-A3B-Instruct

摘要:本文介绍了在Ascend NPU上部署Qwen3-Coder-30B-A3B-Instruct大模型的实践过程。通过vLLM-Ascend框架,详细说明了环境准备(CANN 8.1、PyTorch-NPU 2.5.1等)、模型下载、容器启动及服务部署步骤,包括vLLM服务的启动参数配置和接口测试方法。测试结果显示在当前2卡910B3配置下性能表现仅为8token/s(1并发),并指出流式调用时存在无法输出usage信息的问题。该方案为Ascend平台私有化部署大模型推理服务提供了参考实现。

1668

疾病负担研究(GBD)——如何使用joinpoint软件计算AAPC

疾病负担研究(GBD)——如何使用joinpoint软件计算AAPC

weixin_44240228的博客 1万+

【解析udp通讯传过来的16进制报文并转换为Java类型的值】

在我们做Java使用udp通讯的时候,接收到的一般都是16进制的报文,我们需要将这些报文解析、分割、转换成我们想要得到的值,作者本人翻阅了“大量文献”,发现使用Java的话相对来说比较困难,因为Java中没有指针与联合体,对内存地址的移动不是太好处理,所以以下是我总结出的方法。

m0_61985334的博客 2102

AI Agent在智能投研中的实战:多智能体信息整合与策略生成

那么,什么是AI Agent?简单来说,AI Agent是一种能够感知环境、做出决策并采取行动的自主系统。自主性:能够在没有人类直接干预的情况下运行,对自己的行为和内部状态有一定的控制权。反应性:能够感知环境的变化,并及时做出反应。主动性:不仅能够对环境变化做出反应,还能够主动地设定目标并采取行动实现这些目标。社会性:能够与其他Agent(包括人类和人工智能)进行交互、协作和竞争。它们可以全天候不间断地监控和处理海量信息,大大提升信息处理能力;

AI大模型应用之禅 188

Java基本类型转byte[],java与c通信数据转换

在进行java编程是有时需要进行 基本类型到byte[]数据的转化。在进行与c和C++的通信时我们有时也需要将float,long,int,char等数据转换成byte通过socket通信 等发送到C或C++,然后C和C++再将byte[]转换成float,long,int。 下面这个类是个工具类,除最后两个方法仅能用在java和java通信使用,其它可以用作与c进行通信时转换数据使用。

移动开发 4658

SystemVerilog从入门到实战

SystemVerilog复合数据类型概述 SystemVerilog增强了Verilog的数据建模能力,提供多种复合数据类型: 数组类型:包括定宽数组(固定大小)、动态数组(运行时分配)和多维数组,支持高效索引访问。 队列:结合数组和链表特性,支持两端快速插入/删除操作,提供push/pop等方法。 关联数组:键值对存储结构,支持稀疏数据存储和快速查找,提供exists/delete等方法。 结构体:组合不同类型数据成员,支持打包(packed)形式以优化存储空间。 枚举类型:为数值赋予语义名称,支持状态

2301_79143213的博客 1225

基于WebRTC的现代在线视频会议系统设计与实现

本文详细介绍了如何使用Java和WebRTC技术构建一个完整的在线视频会议系统。我们将从WebRTC的基础原理讲起,逐步深入到信令服务器设计、媒体服务器配置、前后端实现以及高级功能的开发。文章包含大量代码示例和架构图,旨在为开发者提供一套完整的视频会议解决方案。关键词:WebRTC、视频会议、Java、Spring Boot、信令服务器、STUN/TURN、媒体服务器:获取摄像头和麦克风访问权限:处理点对点连接和流传输:实现浏览器之间的任意数据交换。

2201_76125393的博客 186

c++ java 结构体通讯

C++与java的char字节长度不一。

qq_16377055的博客 305

算法真的是个很有用的东西,通过python或者golang实现对N张图片的自动排版,每张图片的长和宽都不一样,有的是横图,有的是竖图,最终需要生成一张完整的矩形图片

算法真的是个很有用的东西,通过python或者golang实现对N张图片的自动排版,每张图片的长和宽都不一样,有的是横图,有的是竖图,最终需要生成一张完整的矩形图片。

代码讲故事 503

c java通讯_Java 与 C进行Socket通讯

1、Java与C的各种数据类型存储的字节数是不同的:Java与C的数据类型的比较TypeJavaCshort2-Byte2-Byteint4-Byte4-Bytelong8-Byte4-Bytefloat4-Byte4-Bytedouble8-Byte8-Byteboolean...

weixin_36409041的博客 331

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

c java通讯_java与C通讯

【实例简介】java与C之间资源的通讯【实例截图】【核心代码】└─sample│ readme.txt│├─source│ ├─C│ │ ├─MemMapCppClient│ │ │ │ MemMapCppClient.cpp│ │ │ │ MemMapCppClient.dsp│ │ │ │ MemMapCppClient.dsw│ │ │ │ MemMa...

weixin_34577501的博客 85

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java 与 C进行Socket通讯

Java 与 C进行Socket通讯 Java 与 C进行Socket通讯 - 椰子 - ITeye技术网站Java 与 C进行Socket通讯 博客分类:java1、Java与C的各种数据类型存储的字节数是不同的:Java与C的数据类型的比较Typ...

89

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java c 网络_Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯...

先交待一下业务应用背景: 服务端:移动交费系统:基于C语言的Unix系统 客户端:增值服务系统:基于Java的软件系统 通迅协议:采用TCP/IP协议,使用TCP以异步方式接入 数据传输:基于Socket流的方式,传输的是网络字节序JavaSocket通讯实现方式这里不做过多的描述,网上到处可以搜索到,比较简单,这里要说的是Java与C进行Socket通讯需注意的地方:1、Java与C的各...

weixin_32060735的博客 257

Socket网络通讯开发总结之:Java 与 C进行Socket通讯

先交待一下业务应用背景: 服务端:移动交费系统:基于C语言的Unix系统 客户端:增值服务系统:基于Java的软件系统 通迅协议:采用TCP/IP协议,使用TCP以异步方式接入 数据传输:基于Socket流的方式,传输的是网络字节序 Java Socket通讯实现方式这里不做过多的描述,网上到处可以搜索到,比较简单,这里要说的是Java 与 C 进行Socket通讯需注意的地方:

如果可以,我愿争取 827

java socket 无符号_Socket网络通讯开发总结之:Java 与 C进行Socket通讯

先交待一下业务应用背景:服务端:移动交费系统:基于C语言的Unix系统客户端:增值服务系统:基于Java的软件系统通迅协议:采用TCP/IP协议,使用TCP以异步方式接入数据传输:基于Socket流的方式,传输的是网络字节序Java Socket通讯实现方式这里不做过多的描述,网上到处可以搜索到,比较简单,这里要说的是Java 与 C 进行Socket通讯需注意的地方:1、Java与C的各种数据类...

weixin_36420089的博客 351

java c 网络_Socket网络通讯开发总结之:Java 与 C进行Socket通讯(转)

先交待一下业务应用背景:服务端:移动交费系统:基于C语言的Unix系统客户端:增值服务系统:基于Java的软件系统通迅协议:采用TCP/IP协议,使用TCP以异步方式接入数据传输:基于Socket流的方式,传输的是网络字节序Java Socket通讯实现方式这里不做过多的描述,网上到处可以搜索到,比较简单,这里要说的是Java 与 C 进行Socket通讯需注意的地方:1、Java与C的各种数据类...

weixin_36105745的博客 324

c java socket_Java 与 C进行Socket通讯

Java 与 C进行Socket通讯 - 椰子 - ITeye技术网站 Java 与 C进行Socket通讯 博客分类: java 1、Java与C的各种数据类型存储的字节数是不同的: Java与C的数据类型的比较 TypeJavaC short2-Byte2-Byte int4-Byte4-Byte...

weixin_33838310的博客 128

c 程序java_java程序和C/C 程序的通讯...

摘要:本文研究了数据存储格式中大尾小尾问题,根据此原理解决了Java程序和C/C++通讯及读取服务器端文件时的数据移植问题。该问题起源于笔者设计的基于Web的远程测控系统。它的基本原理是:服务器端运行一VC编制的服务器程序,客户端使用Javaapplet;VC服务器程序接收到Javaapplet发送的命令后,采集各种信息,并将所有数据发向applet,实现了基于Web的远程温度、加速度的实时监控。...

weixin_35457969的博客 306

c和java通讯_javascript 与applet的通讯 和java与c(dll文件)通讯,最终在b/s架构下实现与硬件(读卡器)通讯...

javascript 与applet的通讯 和java与c(dll文件)通讯,最终在b/s架构下实现与硬件(读卡器)通讯在b/s架构下怎样实现客户端的硬件(读卡器)设备通讯,得到硬件(读卡器)的数据。在此与硬件设备通讯的C或其它的通讯设备语言是由商提供的。我只负责实现javascript与applet通讯和jni与c通讯.在此我们要解决的问题是:1)javascript和applet怎样通讯?2)...

weixin_39879651的博客 219

基于Java语言的C/S模式通讯录备份和查询软件

一 需求分析本设计要求完成一个基于C/S模式的通讯录备份软件,采用C/S架构,具有易用、美观的图形界面。1.1 服务器端功能要求能够验证客户身份,接收客户端的备份通讯录的请求,能够实时备份和更新客户的通讯录加密存储每个用户的通讯录1.2 客户端功能要求能登陆连接到服务器,回应:连接成功/失败能备份本机通讯录能实时更新本机通讯录能查询本机通讯录1.3 本程序...

u011266786的博客 1051
上一篇: 非常不错的IOS学习网站
下一篇: Mac 显示隐藏文件
Enbiting
博客等级 码龄18年 19粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值