1、Java与C的各种数据类型存储的字节数是不同的:
Java与C的数据类型的比较
Type Java C
short 2-Byte 2-Byte
int 4-Byte 4-Byte
long 8-Byte 4-Byte
float 4-Byte 4-Byte
double 8-Byte 8-Byte
boolean 1-bit N/A
byte 1-Byte N/A
char 2-Byte 1-Byte
所以在通讯前,需要进行类型转换,对于C定义的unsign char为一个字节存储,对应Java这边用byte存储;对于C定义的int, long, float对应Java用int存储,具体可以参考以上的表。
2、Socket通讯是按字节传输的(即8个bit位传输),而对于超过一个字节的类型如short 为两个字节,就存在两种传输入方式,一种是高字节在前传输;一种是高字节在后传输。即Little-Endian和Big-Endian。
Little-Endian和Big-Endian是表示计算机字节顺序的两种格式,所谓的字节顺序指的是长度跨越多个字节的数据的存放形式.
假设从地址0x00000000开始的一个字中保存有数据0x1234abcd,那么在两种不同的内存顺序的机器上从字节的角度去看的话分别表示为:
1)little endian:在内存中的存放顺序是0x00000000-0xcd,0x00000001-0xab,0x00000002-0x34,0x00000003-0x12
2)big endian:在内存中的存放顺序是0x00000000-0x12,0x00000001-0x34,0x00000002-0xab,0x00000003-0xcd
需要特别说明的是,以上假设机器是每个内存单元以8位即一个字节为单位的.
简单的说,ittle endian把低字节存放在内存的低位;而big endian将低字节存放在内存的高位.
现在主流的CPU,intel系列的是采用的little endian的格式存放数据,而motorola系列的CPU采用的是big endian.
网络协议都是Big-Endian的,Java编译的都是Big-Endian的,C编译的程序是与机器相关的,具体是否要进行转换是需要沟通的。假设这里需要转换,以下提供short转的换成字节数组的方式:
public static byte[] ShorttoByteArray(short n) {
byte[] b = new byte[2];
b[1] = (byte) (n & 0xff);
b[0] = (byte) (n >> 8 & 0xff);
return b;
}
public static byte[] toLH(short n) {
byte[] b = new byte[2];
b[0] = (byte) (n & 0xff);
b[1] = (byte) (n >> 8 & 0xff);
return b;
}
其它的类型转换类似,无非是根据类型在判断用几个字节进行存储而已。
3、由于Socket通讯是按字节进行传输的,而在Java中只有byte是一个字节,故可以将其它类型都转换成byte数组来存储,如:short用两位的字节数组存储,需转换了换以上方法进行,而int用四位的字节数组来存储,对String类型,直接用String.getBytes()来得到它的字节数组。
4、Java的byte与C语言的unsign char虽然都是一个字节存储,但具体的表示内容是不同的,C的无符号char是取值的范围0--255,而Java中byte取值的范围是-128—127,故在实现C语言的字符串时(C是用char[]来表示字符串的),Java这边需要进行转换来模仿C语的unsign char,具体实现函数如下:
// 将有符号的char转换成无符号的char
public static char[] ToUnsignedChar(char[] signChar) {
for (int i = 0; i < signChar.length; i++) {
int x = ((byte) signChar[i]) >= 0 ? signChar[i] : ((byte) signChar[i]) + 256;
signChar[i] = (char) x;
}
return signChar;
}
这里的关键点是当signChar[i] < 0时,即加上256,将其转换到0--255中来。
通过以上四个方面的注意,基本上就可以实现Java与C进行Socket通讯了。
分享到:
相关推荐
Java和C++之间的Socket通信是跨语言网络编程的一个常见应用场景,尤其在系统集成、设备通讯或者混合编程中。Socket提供了一种基于TCP/IP协议的进程间通信(IPC)方式,可以实现在不同操作系统上的进程之间的数据传输...
本项目着重讲解了如何使用Java与C语言通过Socket进行通信,实现一个基于Web的党费上交系统。在这个系统中,Java负责前端展示和部分业务逻辑,而C则作为后端服务,处理数据存储与查询,两者之间通过Socket进行数据...
本教程将深入探讨如何在C/C++服务器环境下利用Visual Studio 2010与Java客户端环境下的Eclipse进行Socket通信。 一、C/C++服务器端(VS2010) 在Visual Studio 2010中,我们可以使用Winsock库来实现Socket编程。...
Java SocketCAN是一个用于在...总的来说,`java-socketcan`是一个方便Java开发者在Linux环境中进行CAN通信的工具,它通过JNI桥接Java和底层SocketCAN库,提供了易于使用的API,使得在Java中控制CAN设备变得更加简单。
Java版的C/S简单Socket通讯是基于Java编程语言,利用Socket接口实现的客户端/服务器通信模型。在这个场景中,"SWT"(Standard Widget Toolkit)是用于构建图形用户界面(GUI)的库,它提供了丰富的控件和组件,使得...
总之,Java与C之间的通讯可以通过JNI实现底层的紧密集成,也可以通过Socket实现进程间的网络通信。选择哪种方式取决于具体需求,如性能、安全性、跨平台性和代码维护性等因素。无论哪种方式,都需要深入理解各自语言...
标题中的"java_sx.rar_java socket _java 通讯_socket"暗示了这个压缩包可能包含了一些关于使用Java Socket进行网络通信的示例代码或教程资料。Java Socket通信通常涉及以下关键知识点: 1. **Socket类与...
本项目就是这样一个示例,它演示了如何使用Java实现Android与PC之间的Socket通信,实现串口通讯功能。Socket通信是网络编程中常见的一种方式,允许两台设备通过TCP/IP协议进行双向数据传输。 在Android端,你需要...
Socket通讯测试工具是一种实用的软件应用,主要用于帮助程序员在开发过程中检查和验证网络通信功能,尤其是基于TCP/IP的socket通信。这个工具具有双重角色,既能够作为服务器端,也能作为客户端,使得用户能够轻松地...
HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/... 此源码为基于HP_Socket框架的socket通讯源码。方便二次开发。省去研究框架的时间
用 J a v a 实 现 一 个 S o c k e t 通 信 模 型
Java版的Socket编程是网络通信的核心技术之一,尤其在构建局域网聊天工具时尤为重要。本项目通过Java实现了一个功能丰富的即时通讯应用,包括全新界面风格、文字聊天、文件传输、窗口抖动以及语音聊天等功能。 1. *...
首先,我们需要了解**串口Socket通讯**。在Android系统中,由于安全限制,直接访问串口通常需要root权限。然而,可以通过Socket编程来模拟串口通信。通过创建TCP或UDP连接,设备可以在局域网内与其他设备建立通信...
首先,我们要理解串口Socket通讯。在计算机网络中,Socket是一种进程间通信机制,它允许不同主机上的应用程序通过网络进行通信。在Android系统中,串口(Serial Port)通常用于设备间的低级通信,如嵌入式硬件控制、...
文件名“串口&Socket通讯USB驱动&jni”可能包含的资料涵盖了这些方面的详细教程、示例代码或工具,帮助开发者理解并实现这些技术的结合使用。对于从事硬件开发、嵌入式系统或者网络编程的工程师来说,这些都是必不可...
**基于Wifi C/S模式 Socket通讯详解** 在计算机网络通信中,C/S(Client/Server)模式是一种常见的架构设计,它由客户端(Client)和服务器端(Server)组成。在这种模式下,客户端发起请求,服务器端负责处理请求...
本项目"NDK Socket通讯小程序"就是这样一个示例,它通过JNI来实现Socket通信,从而进行数据的接收与发送。下面将详细介绍这个项目涉及的关键知识点。 1. **JNI基础**: JNI是Java平台标准的一部分,它允许Java代码...
本篇介绍了一个简单的Java C/S通讯程序的设计与实现。通过这个例子,我们可以了解到如何利用Java进行基本的网络编程,以及C/S架构的基本原理。对于初学者来说,这是一个很好的学习起点。在未来的学习过程中,还可以...
7. **学习与应用**:对于初学者,这个资源可以提供一个实际的串口Socket通讯与USB驱动结合的示例,有助于理解和实践相关技术。不过,由于描述提到“部分代码功能进行参考学习”,意味着可能需要一定的调试和适配工作...
本项目“Android socket通讯QQ”提供了一个简单的实现,包括客户端和服务端两部分,旨在帮助开发者理解和实践如何在Android平台上构建基于Socket的即时通讯应用。以下是关于这个主题的详细知识点: 1. **Socket基础...