Java与C通信要注意的几个问题

简介: Java与C通信要注意的几个问题

1.大尾(big_endian)小尾(little_endian)的问题

基于Web的测试软件是由C++数据采集服务器程序和客户端Java显示程序两部分构成,前者用C++,后者Java语言,存在数据移植问题。因为在计算机系统中,当包含数字的二进制文件从一个结构移到另一结构时,就出现大尾小尾问题。不同CPU在多字节数(如四字节int)存储时有两种方法,一种方法叫小尾(little_endian),数据的低字节被放置在连续存储区的首位,另一种方法叫大尾(big_endian),数据的高字节被放置在连续存储区的首位。Intel 80×86家族处理器是最后一个仍然坚持小尾的主要结构。所有其他的CPU结构(Motorola 680×0和所有RISC芯片)或者是纯粹的大尾或者是既适应大尾也适应小尾,大尾被认为是更符合逻辑的方法)。当数字由小尾处理器写入文件然后又由大尾处理器读取(或者倒过来)时,数字就会被搞乱(除了0和-1)。

目前在笔者参与的项目中平台中心的GM Server是C语言实现的,而我们这边的GM client为Java实现的,自然需要考虑这个通信时的大小尾转换,主要涉及short,int,long类型,String,byte类型不需要转换.

2.类型字节大小的问题

C语言中的基本类型如下:

 

类型

定义

说明

BYTE

typedef unsigned char BYTE

单字节

WORD

typedef unsigned short WORD

双字节无符号整数

SWORD

typedef signed short SWORD

双字节符号整数

DWORD

typedef unsigned int DWORD

四字节无符号整数

SDWORD

typedef signed int SDWORD

四字节符号整数

 

Java的八种基本数据类型如下:

byte     1字节              
short    2字节              
int         4字节  
           

long     8字节 (C语言中是4字节)              

char     2字节(C语言中是1字节)

float     4字节              

double  8字节              

boolean bool;  false/true

 

3 综合:

大尾小尾转换举例:

比如有个Int Java类型十六进制

00 00 80 01 (大尾)

转换成C语言时为:

01 80 00 00 (小尾)

比如short 类型

40 02 (大尾)

02 40 (小尾)

一般比如Mina通讯框架都有大小尾转换的现成的API可供调用

IOBuffer.order(ByteOrder.LITTLE_ENDIAN)  //转成了小尾

IOBuffer.order(ByteOrder.BIG_ENDIAN)  //转成了大尾


JAVA 默认 大尾

C 默认小尾

AS 默认大尾


byte[]数组的翻转可以使用ArrayUtils.reverse(byte[])  结合关于数据窄化的介绍就可以完成大小尾的转换了。

参考文献:

Java和C/C++程序实时通讯数据移植问题的研究

关于数据窄化

英文字母和数字1个字节,中文UTF-8三个字节,GBK两个字节

目录
相关文章
|
3月前
|
Java
实现Java多线程中的线程间通信
实现Java多线程中的线程间通信
|
7天前
|
传感器 网络协议 Java
三大硬核方式揭秘:Java如何与底层硬件和工业设备轻松通信!
大家好,我是V哥。最近与一位从事工业互联网项目的学员交流,启发我分享Java如何与底层硬件和工业设备通信。本文将介绍三种方法:1)使用`jLibModbus`库通过Modbus协议读取设备寄存器数据;2)使用JNI(Java Native Interface)直接访问硬件;3)使用`JSerialComm`库通过串口通信读取数据。每种方法都有详细步骤和示例代码,帮助你轻松实现与硬件设备的通信。无论是工业自动化还是物联网应用,这些方法都能派上用场。欢迎关注和支持!
|
2月前
|
消息中间件 Java API
解密微服务架构:如何在Java中实现高效的服务通信
微服务架构作为一种现代软件开发模式,通过将应用拆分成多个独立的服务,提升了系统的灵活性和扩展性。然而,实现微服务之间的高效通信仍然是许多开发者面临的挑战。本文将探讨在Java环境中实现微服务架构时,如何使用不同的通信机制来优化服务之间的交互,包括同步和异步通信的方法,以及相关的最佳实践。
|
2月前
|
存储 安全 Java
【多线程面试题 七】、 说一说Java多线程之间的通信方式
Java多线程之间的通信方式主要有:使用Object类的wait()、notify()、notifyAll()方法进行线程间协调;使用Lock接口的Condition的await()、signal()、signalAll()方法实现更灵活的线程间协作;以及使用BlockingQueue作为线程安全的队列来实现生产者和消费者模型的线程通信。
|
2月前
|
Java
Java模拟文件发送给服务器,服务器将文件转发给其他用户,并保存到服务器本地,其他用户可以接收,并保存到本地磁盘,支持各种文件格式,并解决通信中服务器怎么区分客户端发来的文件类型
Java模拟文件发送给服务器,服务器将文件转发给其他用户,并保存到服务器本地,其他用户可以接收,并保存到本地磁盘,支持各种文件格式,并解决通信中服务器怎么区分客户端发来的文件类型
|
4月前
|
Java API 开发者
Java网络编程基础与Socket通信实战
Java网络编程基础与Socket通信实战
|
3月前
|
Java
实现Java多线程中的线程间通信
实现Java多线程中的线程间通信
|
3月前
|
网络协议 Java 数据处理
(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述
就目前而言,多数网络编程的系列的文章都在围绕着计算机网络体系进行阐述,但其中太多理论概念,对于大部分开发者而言,用途甚微。因此,在本系列中则会以实际开发者的工作为核心,从Java程序员的角度出发,详细解读Java的网络编程核心内容。
|
3月前
|
网络协议 Java API
如何在Java中实现WebSocket通信
如何在Java中实现WebSocket通信
|
3月前
|
消息中间件 安全 Java
Java中的线程间通信详解
Java中的线程间通信详解
下一篇
无影云桌面