展开全部

JAVA字节序

BIG-ENDIAN、LITTLE-ENDIAN跟多字节类型的数据有关32313133353236313431303231363533e4b893e5b19e31333361303032,比如int,short,long型,而对单字节数据byte却没有影响。BIG-ENDIAN就是低位字节排放在内存的高端,高位字节排放在内存的低端。而LITTLE-ENDIAN正好相反。

比如 int a = 0x05060708

在BIG-ENDIAN的情况下存放为:

字节号 0 1 2 3

数据 05 06 07 08

在LITTLE-ENDIAN的情况下存放为:

字节号 0 1 2 3

数据 08 07 06 05

BIG-ENDIAN、LITTLE-ENDIAN跟CPU有关,每一种CPU不是BIG-ENDIAN就是LITTLE-ENDIAN。IA架构的CPU中是Little-Endian,而PowerPC 、SPARC和Motorola处理器则是BIG-ENDIAN。这其实就是所谓的主机字节序。而网络字节序是指数据在网络上传输时是大头还是小头的,在Internet的网络字节序是BIG-ENDIAN。所谓的JAVA字节序指的是在JAVA虚拟机中多字节类型数据的存放顺序,JAVA字节序也是BIG-ENDIAN。

所以在用C/C++写通信程序时,在发送数据前务必用htonl和htons去把整型和短整型的数据进行从主机字节序到网络字节序的转换,而接收数据后对于整型和短整型数据则必须调用ntohl和ntohs实现从网络字节序到主机字节序的转换。如果通信的一方是JAVA程序、一方是C/C++程序时,则需要在C/C++一侧使用以上几个方法进行字节序的转换,而JAVA一侧,则不需要做任何处理,因为JAVA字节序与网络字节序都是BIG-ENDIAN,只要C/C++一侧能正确进行转换即可(发送前从主机序到网络序,接收时反变换)。如果通信的双方都是JAVA,则根本不用考虑字节序的问题了。

如果网络上全部是PowerPC,SPARC和Motorola CPU的主机那么不会出现任何问题,但由于实际存在大量的IA架构的CPU,所以经常出现数据传输错误。

文章开头所提出的问题,就是因为程序运行在X86架构的PC SERVER上,发送数据的一端是用C实现的,接收一端是用JAVA实现的,而发送端在发送数据前未进行从主机字节序到网络字节序的转换,这样接收端接收到的是LITTLE-ENDIAN的数据,数据解释自然出错。

具体数据如下,实际发送的数据为23578

发送端发送数据: 1A 5C

接收端接收到数据后,按BIG-ENDIAN进行解释具体数据是多少?你们自己去计算并比较吧!

===============================================================================================

Big Endian and Little Endian

谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据

为什么要注意字节序的问题呢?你可能这么问。当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?尤其是当你把你在微机上运算的结果运用到计算机群上去的话。在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而JAVA编写的程序则唯一采用big endian方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的JAVA程序互通时会产生什么结果?就拿上面的 0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了JAVA程序,由于JAVA采取big endian方式存储数据,很自然的它会将你的数据翻译为0x8765431。什么?竟然变成另外一个数字了?是的,就是这种后果。因此,在你的C程序传给JAVA程序之前有必要进行字节序的转换工作。

Big-Endian和Little-Endian优缺点

Big-Endian优点:靠首先提取高位字节,你总是可以由看看在偏移位置为0的字节来确定这个数字是正数还是负数。你不必知道这个数值有多长,或者你也不必过一些字节来看这个数值是否含有符号位。这个数值是以它们被打印出来的顺序存放的,所以从二进制到十进制的函数特别有效。因而,对于不同要求的机器,在设计存取方式时就会不同。

Little-Endian优点:提取一个,两个,四个或者更长字节数据的汇编指令以与其他所有格式相同的方式进行:首先在偏移地址为0的地方提取最低位的字节,因为地址偏移和字节数是一对一的关系,多重精度的数学函数就相对地容易写了。

如果你增加数字的值,你可能在左边增加数字(高位非指数函数需要更多的数字)。因此,经常需要增加两位数字并移动存储器里所有Big-endian顺序的数字,把所有数向右移,这会增加计算机的工作量。不过,使用Little- Endian的存储器中不重要的字节可以存在它原来的位置,新的数可以存在它的右边的高位地址里。这就意味着计算机中的某些计算可以变得更加简单和快速。

little-endian java_Little-Endian的JAVA相关推荐

  1. 字节序是什么?(大小端 Big endian Little endian)

    字节序,即字节在电脑中存放时的序列与输入(输出)时的序列是先到的在前还是后到的在前. 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序. 常见序: Little endian: 将 ...

  2. big endian little endian

    大端(big-endian)和小端(little-endian)<转> 2007-12-07 20:36 补:x86机是小端(修改分区表时要注意),单片机一般为大端 今天碰一个关于字节顺序 ...

  3. 汽车以太网-SOME/IP之字节序(Network Byte Order-Big Endian)

    引子 SOME/IP规范中有如下定义: All SOME/IP Header Fields shall be encoded in network byte order(big endian). 译文 ...

  4. [转]java中文乱码解决之道(三)-----编码详情:伟大的创想---Unicode编码

    http://www.cnblogs.com/chenssy/ java中文乱码解决之道(三)-----编码详情:伟大的创想---Unicode编码 随着计算机的发展.普及,世界各国为了适应本国的语言 ...

  5. Java:Unicode简介(处理数据显示异常)

    一般对于新手来说,由于对Unicode编码不够了解,所以数据编码异常是经常会碰到的问题.例如页面显示字符异常等 Unicode是一种字符编码规范 . 先从ASCII说起.ASCII是用来表示英文字符的 ...

  6. java endian_java的little-endian和big-endian

    简而言之:Big endian machine: It thinks the first byte it reads is the biggest.Little endian machine: It ...

  7. java 多线程 安全 源码,纯干货,从源码解析多线程与高并发,再说不会,我再也不踏足IT圈...

    没什么太多说的,多线程与高并发,面试重点,咱直接进入正题,联合底层源码,咱们从源码看一下,多线程与高并发底层的知识点,这也是阿里p8+的面试官建议的学习到的级别java CAS Compare And ...

  8. Java中的char究竟能存中文吗?

    网上搜索这个问题,答案清一色都是能,毕竟随便写行代码都能清晰地证明可以: char c = '我'; 但是事实并不是那么简单,Java的char内部编码为UTF-16,请参考String编码(二) 证 ...

  9. 【JAVA编码专题】UNICODE,GBK,UTF-8区别

    简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的uncode值与g ...

  10. 在ubuntu下设置eclipse开发STM32等嵌入式设备

    之前为了能够让ROS与底层能够顺利通讯,我采用可开源开发板arduino ,因为arduino有ROS的库,能够按照ROS wiki上所给的教程就可以顺利的开发,但由于arduino的局限性,我觉得是 ...

最新文章

  1. PostgreSQL学习手册(七) 事物隔离
  2. Failed to resolve:com.android.support:appcompat-v7
  3. hdu4536 水搜索
  4. 使用脚本实现自动清除指定文件夹下丢失链接文件的符号链接
  5. Linux进程核心代码怎么查看,GCOV查看arm-linux代码覆盖率
  6. NOI题库 7654 等差数列末项计算
  7. 多个折线样式_新技能get,折线图转化成多阶梯瀑布图
  8. 传说中的“铁索连环”?苹果要把无人车串成小火车
  9. hduoj 1518square
  10. 阅读笔记-JavaScript学习指南
  11. hadoop处理excel数据
  12. ‼ gifsicle pre-build test failed
  13. My Fifty-Ninth 全排列Ⅱ - By Nicolas
  14. AI Now:比人脸识别更可怕的黑科技---情绪识别
  15. ICO和区块链的关系
  16. 一个请求式分页存储管理系统中计算机应用,操作系统概论自考2012年7月真题
  17. 第四篇:读《穷查理宝典》
  18. SpringBoot+Vue实现前后端分离的小而学在线考试系统
  19. Redis详细总结笔记
  20. Magic Leap开发指南(3)-- 将你的Cube投递给其他用户

热门文章

  1. Docker 配置国内源加速镜像下载
  2. 原生js监听滚动条_JS原生监听滚动条
  3. 《裸辞后,降薪找工作》
  4. 商户/服务商微信支付开发文档【 直连模式/服务商模式】如何在公众号、小程序中接入微信支付?
  5. 证券公司服务器系统错误,招商证券系统错误是怎么回事 招商证券服务器崩溃...
  6. 视频教程-java淘宝优惠券系统二-Java
  7. 今天的骑行路线。。。
  8. python seek(0)_seek() 方法
  9. matlab filter zf,什么是MATLAB函数过滤器中’zf’的内容
  10. 世界三大顶级音响_世界十大名牌音响有那些