薛之谦 刚刚好专辑:C与java通讯小结
来源:百度文库 编辑:九乡新闻网 时间:2024/05/09 10:32:56
C与java通讯小结
(2010-09-19 15:36:49)转载 标签:杂谈
分类: Java学习(1)字节序问题:这个是通讯的大问题。。前面几篇文章也转载了查阅到的一些资料。总的来说C一般使用的是小尾存储数据,而java使用大尾存储,所谓大尾存储就是数据高字节在前,低字节在后存储。而网络中的数据则都是大尾存储。另字符串在传输过程中不会发生变化,而int,long等数值类型的数据会经过根据大小尾进行存储传输。所以当java与c进行通信的时候,java一段数据基本不用进行大小尾转化,而c收到数据后要进行NToH转化,发送数据的时候也要进行HToN数据转化。再加上字符串,打成包传输即可。
(2)传输包问题:总所周知,传输数据不可能一个字节一个字节发送,没有意义,当然要打成代表一定意义的包进行发送,包就要有包头,包尾。比如下面包的定义:
消息结构
项目
说明
Message Header
消息头(所有消息公共包头)
Message Body
消息体
消息头格式(MessageHeader)
字段名
字节数
类型
描述
Total_Length
4
Unsigned
消息总长度(含消息头及消息体)
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:解析错误
再者对数据包发送的时候,是根据接口文件的。。也就是java和c通讯接口文件,自己定义的了,一致就行。这里面如上面包格式所示,都定义好了每个字段的长度,那么当读取的时候也要根据这个长度进行读取。那么当实际的长度没有这么长怎么办呢?那就需要双方定义好填充字符,是使用空字符('\0')呢,还是空格('')呢,c里面读取一般遇到空字符就停止。所以使用空字符会比较普遍一些。当java接收到数据后,也要根据找个字符解析出真正长度的字符串。比如使用下面函数去掉后面的空字符:
而java得到包之后,如何得到每个字段呢,这个没有别的办法了,只能一段一段的拷贝了。下面是我使用的拷贝方法:
private String getServerName() {
而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) {
//short2byte
public static byte[] short2byte(int n) {
// long到byte的转换
等等,注意:这里只是进行普通的字节码和数值之间的类型转换,并不进行高低位转化。原因前面已经说过了,java和网络字符是一样的,都是高位前,低位后,所以不用进行转化。
(4)中文传输问题:
网络中传输中文极易出现乱码,那怎么办比较好呢,对了,就是对中文进行编码,常用的是Base64编码。再对编码后数据进行传输,接收到后也要先进行base64解码即可。
C与java通讯小结
引用 java和C通讯 - tengyunju@126的日志 - 网易博客
《(转)Java串口通讯》
Java内存分配、管理小结1
Java内存分配、管理小结2
转载:转载:C语言常见错误小结
JNI性能测试一—JNI调用C与Java调用java性能比较 - zgjxwl-----传说中晨雨的专栏 - CSDN博客
PLC与触摸屏通讯电缆
STM32 USB与PC 通讯
C 和java中多态机制的异同
java版本号与别名
C#.net同步异步SOCKET通讯和多线程总结
《(转)Java串口通讯》-王伟东的个人Blog|你好Blog
变频器与变频器通讯的精简设计
JNA 实现Java调用C动态链接库
RMI-IIOP与JNDI简单小结
第8章 供应商与经销商 小结
第11章 管理与协调 小结
JAVA基础:关于Java栈与堆的思考
java
log4j.properties详解与例子,Java实例教程,Java系列教程,Java
方便 Ajax 与 Java EE 的集成
JSON与JAVA的数据转换
华为与中兴通讯商标争端升级 - FT中文网