首页 > 编程语言 >Java与C通信要注意的几个问题

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

时间:2022-12-27 19:01:35浏览次数:56  
标签:Java 字节 int 大尾 通信 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两个字节

标签:Java,字节,int,大尾,通信,C语言,小尾,注意
From: https://blog.51cto.com/u_4176761/5973357

相关文章

  • Java和MySQL数据类型对应一览
    Table 20.25. MySQLTypestoJavaTypesforResultSet.getObject()MySQLTypeNameReturnvalueofGetColumnClassNameReturnedasJavaClassBIT(1) (new......
  • java localDataTime
                               ......
  • java流Stream
    有一个列表,从中筛选出值大于30的元素。看看用传统的做法和Java流的做法有什么不同。List<Integer>list=newArrayList<>();list.add(1);list.add(20);list.add(40);......
  • Java: ParameterizedType用法与简介(转载)
    转载地址:https://blog.csdn.net/sageyin/article/details/114701550https://www.cnblogs.com/baiqiantao/p/7460580.html......
  • Java同步器之辅助类Semaphore
    一、概述Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。二、使用案例可以用于做流量控制,特别是公用资源有限的应......
  • 严重漏洞攻击:影响PHP、Java和ASP.NET
    安全研究员AlexanderKlink和JulianWalde发现了一个严重的漏洞,这个漏洞影响到大多数网络服务器。针对这个漏洞的攻击只需要一个HTTP请求,这个特殊设定......
  • Java8中Optional类入门-替代null避免冗杂的非空校验
    场景Java核心工具库Guava介绍以及Optional和Preconditions使用进行非空和数据校验:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127683387上面在讲Guava......
  • 程序员必须掌握的java进制转换(全网最详细讲解)
    前言在上一篇文章中,壹哥给大家讲了Java里的各种运算符。其中在讲解位运算符时,我给大家提到了计算机中进制的概念。但是现在很多小白同学,对进制的概念还不够了解,比如二进制......
  • java throws异常处理
        throws异常,程序不能继续执行,直接中断,要想程序继续执行,还必须用try...catch     ......
  • 跟光磊学Java-Windows版Java17开发环境搭建
    Java语言核心技术  如果想要开发Java程序/Java项目之前,必须要安装和配置JDK,这里的JDK表示Java17,不过下载软件的时候,强烈推荐大家一定要去软件的官网下载,因为官......