1:判断大端小端机器方法
inti=0X12345678
0X120X340X560X78 大端存储(BigEndian)按照字符串从左向右的顺序存储
0X78 0X560X340X12小端存储(LittleEndian)
程序:
利用联合类型,联合类型,个联合共享一段内存空间,一个联合变量的长度是各成员中最长的长度
int main() { union ut{ short s; char c[2]; }u; if(sizeof(short) == 2) { u.s = 0x0102; if(u.c[0] == 1 && u.c[1] == 2) { printf("big enidan/n"); }else if(u.c[0] == 2 && u.c[1] == 1) { printf("little endian./n"); } return 0; } }
2:java 内存中数据的存储 采用的是大端模式
而C++是 采用 小端模式
服务器端是c++ 客户端是java 这样发送数据的时候 字节顺序要进行调整,因为C++server端直接从socket流中读取出数据,没有关心是否将数据按照网络字节顺序(即大端模式)进行解析
则:
如果发送int类型的数据时候 ,就需要手动组拼 字节数组,将int转换为字节数组
/** * 将int转为低字节在前,高字节在后的byte数组 */ private static byte[] toLH(int n) { byte[] b = new byte[4]; b[0] = (byte) (n & 0xff); b[1] = (byte) (n >> 8 & 0xff); b[2] = (byte) (n >> 16 & 0xff); b[3] = (byte) (n >> 24 & 0xff); return b; }
同样其它类型的数据(除字符型外)也需要进行字节顺序调整
问题2:如果C++服务器接受字符使用的是wchar_t字节 类型 那java传递字符类型的时候要注意
调整字节顺序, 因为wchar_t类型 针对汉字和英文都占用两个字节
例子: String name = "杨abc";
上面的字符串其 大端显示情况为:
public static void printbyte(byte[] bt) { for (int i = 0; i < bt.length; i++){ int hex = (int)bt[i] & 0xff; System.out.print(Integer.toHexString(hex) + " "); } System.out.println(" length = "+bt.length); } @Test public void test1() throws UnsupportedEncodingException { String name = "杨彬abc"; // TODO Auto-generated method stub byte[] defaultBytes = name.getBytes(); printbyte(defaultBytes); byte[] utf_8 = name.getBytes("utf-8"); printbyte(utf_8); byte[] utf_16be = name.getBytes("utf-16be"); printbyte(utf_16be); byte[] utf_16le = name.getBytes("utf-16le"); printbyte(utf_16le); byte[] gbk = name.getBytes("gbk"); printbyte(gbk); /* * e6 9d a8 e5 bd ac 61 62 63 length = 9 默认 e6 9d a8 e5 bd ac 61 62 63 length = 9 utf-8 汉字占三个字节 而utf-8 采用 3 个字节存储汉字 1个字节存储英文字符 unicode 采用两个字节存储汉字及英文字符 67 68 5f 6c 0 61 0 62 0 63 length = 10 大端方式 汉字占两个字节 68 67 6c 5f 61 0 62 0 63 0 length = 10 小端方式 gbk采用两个字节存储汉字 d1 ee b1 f2 61 62 63 length = 7 */ //网络编程socket 通讯 针对字符串采用 utf-16le 这种方式存储 }
相关推荐
Java和C++作为两种广泛使用的编程语言,它们之间的Socket通信是跨平台交互的一种常见实践。本文将深入探讨如何在Java和C++之间通过Socket进行结构体的发送与接收。 首先,我们需要理解Socket通信的基本原理。Socket...
总的来说,大端模式和小端模式是计算机处理多字节数据时的一种组织方式,它们反映了不同架构对于数据存储的偏好。在编写跨平台软件或进行网络通信时,必须考虑到目标系统的字节序,以免造成数据解析错误。程序员可以...
大端小端模式是计算机行业中一个重要的概念,它决定了数据在存储器中的存放顺序。这个概念来自 Jonathan Swift 的书《格列佛游记》,书中讲述了鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归...
提供一个大小端转换的类,可以转换short int float double类型,提供一个大小端转换的类,可以转换short int float double类型,提供一个大小端转换的类,可以转换short int float double类型
根据数据的高位和低位在内存中的存储顺序,大端小端模式可以分为两种:大端模式和小端模式。 大端模式是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。例如,在大端模式下,16位宽的数 0x...
大端模式(Big-Endian)和小端模式(Little-Endian)是两种不同的字节序,它们决定了多字节数据(如整数、浮点数)在内存中的存储顺序。理解这两种模式对于编写跨平台的软件,特别是在网络通信和嵌入式系统设计中至...
标题中的“Java和C++通信结构体发送”指的是在Java和C++这两种不同的编程语言之间,通过网络进行通信时如何有效地传递结构体数据的问题。在跨语言通信中,由于二进制序列化和内存布局的差异,直接传输结构体会面临...
1. **Java Socket基础**:Socket是TCP/IP协议的应用层接口,用于实现两台机器之间的数据传输。在Java中,`java.net.Socket`和`java.net.ServerSocket`类是进行Socket通信的核心。ServerSocket监听特定端口,等待...
字节序转换辅助类,short大小端转换,ushort大小端转换,int大小端转换,uint大小...short类型 小端转大端,short类型 大端转小端,int类型 小端转大端,int类型 大端转小端,long类型 小端转大端,long类型 大端转小端
在C/C++编程语言中,大小端问题通常在处理多字节类型的数据时出现,例如int、long、float和double等。由于C/C++标准并未规定如何存储这些类型的数据,因此,不同的处理器架构可能会有不同的字节序选择。例如,Intel ...
java实现使用javolution完成数据接收过程中大小端转换的问题
运行程序,可判识并输出程序所在平台的存储方式,是大端还是小端。
目前主要存在两种字节序类型:大端模式(Big Endian)与小端模式(Little Endian)。这两种模式直接影响着程序在不同系统之间的兼容性以及网络通信中数据包的解码。 #### 大端模式(Big Endian) 大端模式是指在多...
C++ SOCKET编程是一种在C++中实现网络通信的技术,它基于Berkeley Sockets接口,允许开发者创建客户端和服务器应用程序,实现跨网络的数据传输。SOCKET是操作系统提供的一个接口,使得程序能够通过网络发送和接收...
计算机系统中,对于多字节数据类型的处理存在两种不同的字节顺序:**大端格式**(Big-endian)与**小端格式**(Little-endian)。这两种格式的区别在于如何在内存中存储这些数据类型。 1. **小端格式(Little-...
检测系统是使用大端模式还是小端模式 将系统字节序和网络字节序进行转换 使用C++代码实现 基于Visual Studio 2022
本资源提供了C和C++两种语言的源码示例,帮助开发者深入理解Socket编程的基本原理和实践方法。 首先,让我们从基础概念开始。Socket可以被视为进程间通信的一种接口,它在互联网层面上实现了不同主机间的通信。在...
本文将深入探讨客户端和服务器端的Socket通讯原理、实现过程以及相关知识点。 首先,理解Socket的基本概念至关重要。Socket,又称为套接字,是网络编程中的一个接口,为进程间通信(IPC)提供了标准化的方法。在...