近期在写C++ socket和java socket之间的通信程序,涉及到整数浮点数的传输。须要从字节数组还原数据,查了一些资料。总结例如以下

1.       整数和浮点数的机器表示

在机器内部。不论是一个整数还是浮点数。都是以一个二进制串的形式存储。

整数可能是原码。补码表示,浮点数有阶码尾数两部分构成。不管如何都是一个二进制串。可是这个二进制串如何表示不同的机器可能採取不同的方案。

关于浮点数:

一个机器上的32位浮点数的二进制串在还有一个机器把它作为32位浮点数解释时可能得到不同的值,这样不同机器上进行网络传输的时候,大概就仅仅能用传字符串的方式了。只是幸好。IEEE 754规范标准化了浮点数的表示形式。遵从这个标准的不同编程语言里仅仅要遵从这个标准,那么某个浮点数的32位二进制串都是一样的,,,和CPU无关,和语言无关

关于整数 :

    单个字节的整型值就是一个字节;占用多个字节的整数,其表示有所差别,有所谓的小端法。大端法,详细表示能够看以下的图。

2.      小端法、大端法和主机字节顺序、网络字节顺序

小端法和大端法如图所看到的

网络字节序就是大端顺序,由于TCP/IP首部中全部的二进制整数在网络中传输时都要求以这样的次序,因此它又称作网络字节序。

主机字节顺序就是指相对于网络传输是的字节顺序的主机上的字节顺序。有大端表示法,小端表示法。

3.      以下给出java中的基本数据类型和字节数组byte[]之间的转换代码

本文中byte[]的顺序依照“大端顺序”。这句话的意思是说对于整数0x11223344

byte[0]保存0x11。byte[1]保存0x22。byte[2]保存0x33,byte[3]保存0x44

採用这样的“大端顺序”,由byte[]转int,或由int转byte[]。这里面byte的顺序都须要是上面描写叙述的“大端顺序”,这样优点是server发送时能够调用htonl。htons等函数将字节顺序转换为网络字节顺序,事实上关键是server和client要有一个一致的表示规范,看起来似乎网络字节顺序更顺眼一些?

Java对于各种基本类型的长度做了规定,所以相应byte数组的长度也固定,和机器无关。

以下是char,short,int,float,long,double转换的代码。核心是利用位操作,取出某个字节中的8个位,进行转换。

非常大程度上參考了http://tjmljw.iteye.com/blog/1767716一文中的实现(该文採用的是“小端顺序”的byte数组,我用的是“大端顺序”)。

import java.nio.ByteOrder;public class ByteArrayConveter {// char转换为byte[2]数组public static byte[] getByteArray(char c) {byte[] b = new byte[2];b[0] = (byte) ((c & 0xff00) >> 8);b[1] = (byte) (c & 0x00ff);return b;}// 从byte数组的index处的连续两个字节获得一个charpublic static char getChar(byte[] arr, int index) {return (char) (0xff00 & arr[index] << 8 | (0xff & arr[index + 1]));}// short转换为byte[2]数组public static byte[] getByteArray(short s) {byte[] b = new byte[2];b[0] = (byte) ((s & 0xff00) >> 8);b[1] = (byte) (s & 0x00ff);return b;}// 从byte数组的index处的连续两个字节获得一个shortpublic static short getShort(byte[] arr, int index) {return (short) (0xff00 & arr[index] << 8 | (0xff & arr[index + 1]));}// int转换为byte[4]数组public static byte[] getByteArray(int i) {byte[] b = new byte[4];b[0] = (byte) ((i & 0xff000000) >> 24);b[1] = (byte) ((i & 0x00ff0000) >> 16);b[2] = (byte) ((i & 0x0000ff00) >> 8);b[3] = (byte)  (i & 0x000000ff);return b;}// 从byte数组的index处的连续4个字节获得一个intpublic static int getInt(byte[] arr, int index) {return     (0xff000000     & (arr[index+0] << 24))  | (0x00ff0000   & (arr[index+1] << 16))  | (0x0000ff00   & (arr[index+2] << 8))   | (0x000000ff   &  arr[index+3]);}// float转换为byte[4]数组public static byte[] getByteArray(float f) {int intbits = Float.floatToIntBits(f);//将float里面的二进制串解释为int整数return getByteArray(intbits);}// 从byte数组的index处的连续4个字节获得一个floatpublic static float getFloat(byte[] arr, int index) {return Float.intBitsToFloat(getInt(arr, index));}// long转换为byte[8]数组public static byte[] getByteArray(long l) {byte b[] = new byte[8];b[0] = (byte)  (0xff & (l >> 56));b[1] = (byte)  (0xff & (l >> 48));b[2] = (byte)  (0xff & (l >> 40));b[3] = (byte)  (0xff & (l >> 32));b[4] = (byte)  (0xff & (l >> 24));b[5] = (byte)  (0xff & (l >> 16));b[6] = (byte)  (0xff & (l >> 8));b[7] = (byte)  (0xff & l);return b;}// 从byte数组的index处的连续8个字节获得一个longpublic static long getLong(byte[] arr, int index) {return    (0xff00000000000000L    & ((long)arr[index+0] << 56))  | (0x00ff000000000000L    & ((long)arr[index+1] << 48))  | (0x0000ff0000000000L    & ((long)arr[index+2] << 40))  | (0x000000ff00000000L    & ((long)arr[index+3] << 32))  |(0x00000000ff000000L     & ((long)arr[index+4] << 24))  | (0x0000000000ff0000L    & ((long)arr[index+5] << 16))  | (0x000000000000ff00L    & ((long)arr[index+6] << 8))   | (0x00000000000000ffL    &  (long)arr[index+7]);}// double转换为byte[8]数组public static byte[] getByteArray(double d) {long longbits = Double.doubleToLongBits(d);return getByteArray(longbits);}// 从byte数组的index处的连续8个字节获得一个doublepublic static double getDouble(byte[] arr, int index) {return Double.longBitsToDouble(getLong(arr, index));}public static void main(String[] args) {System.out.println(ByteOrder.nativeOrder());if(args.length < 1){System.out.println("enter 'char' test method about char");System.out.println("enter 'short' test method about short");System.out.println("enter 'int' test method about int");System.out.println("enter 'float' test method about float");System.out.println("enter 'long' test method about long");System.out.println("enter 'double' test method about double");return;}if(args[0].equals("char")){char c = '\u0000';while( c < '\uffff'){System.out.println(getChar(getByteArray(c),0));c++;}}else if(args[0].equals("short")){short s = Short.MIN_VALUE;while( s < Short.MAX_VALUE){System.out.println(getShort(getByteArray(s), 0));s++;}}else if(args[0].equals("int")){int i = Integer.MIN_VALUE;while( i < Integer.MAX_VALUE){System.out.println(getInt(getByteArray(i), 0));i++;}}else if(args[0].equals("float")){float f = Float.MIN_VALUE;while(f < Float.MAX_VALUE){System.out.println(getFloat(getByteArray(f), 0));f+=1.1111f;}}else if(args[0].equals("long")){long l = Long.MIN_VALUE;while(l < Long.MAX_VALUE){System.out.println(getLong(getByteArray(l), 0));l++;}}else if(args[0].equals("double")){double d = Double.MIN_VALUE;while(d < Double.MAX_VALUE){System.out.println(getDouble(getByteArray(d), 0));d+=1.111D;}}}
}

说明:

本文由giantpoplar发表于CSDN

文章地址 http://write.blog.csdn.net/postedit/47657333

转载请保留本说明

转载于:https://www.cnblogs.com/lxjshuju/p/7119370.html

字节数组byte[]和整型,浮点型数据的转换——Java代码相关推荐

  1. Java 字节数组(byte[])和整型(int)的相互转换

    文章目录 前言 一.int 转换为 byte[] 二.测试代码 三.测试 四.byte[] 转换为 int 总结 前言 恰巧碰到了字节数组和整型的转换问题,特在此总结一下.将 int 按照小端法映射到 ...

  2. matlab整型和浮点的区别,技术帖 | 心理学MATLAB初学者教程--简单数据类型介绍(逻辑型数据,整型/浮点型数据,字符型)......

    1.2.1 什么是变量和变量名 变量这个词似乎在许多地方都有出现,在计算机中变量是指是一段有名字的连续存储空间(摘自百度百科),而这个所谓的名字就叫做变量名.举个例子说现在我们再MATLAB的命令窗口 ...

  3. c#中字节数组byte[]、图片image、流stream,字符串string、内存流MemoryStream、文件file,之间的转换

    字节数组byte[]与图片image之间的转化 字节数组转换成图片 public static Image byte2img(byte[] buffer) {MemoryStream ms = new ...

  4. 有符号整型的数据范围为什么负数比正数多一个?

    背景 我们先看Leetcode的这道题目: 标题:50. Pow(x, n) 难度:中等 https://leetcode-cn.com/problems/powx-n/ 实现 pow(x, n) , ...

  5. Java字节数组byte b[]与byte[] b

    Java中的字节数组 Java字节数组仅用于存储字节数据类型值.字节数组中元素的默认值为0. 通过以下Java字节数组示例,您可以学习 如何声明Java字节数组? 如何为Java字节数组分配值? 如何 ...

  6. C#中字节数组(byte[])和字符串相互转换

    转换过程主要使用到System.Text.Encoding命名空间下的类 1. 字符串转换成字节数组byte[]: string str = "This is test string&quo ...

  7. C#字节数组(byte[])和字符串相互转换

    转换过程主要使用到System.Text.Encoding命名空间下的类 1. 字符串转换成字节数组byte[]: string str = "This is test string&quo ...

  8. 实现客户机(Client)类声明字符型静态数据成员ServerName,保存其服务器名称;整型静态数据成员ClientNum,记录已定义的客户机数量;定义静态函数成员ChangeServerName

    实现客户机(Client)类.声明字符型静态数据成员ServerName,保存其服务器名称:整型静态数据成员ClientNum,记录已定义的客户机数量:定义静态函数成员ChangeServerName ...

  9. 短整型转字符数组,字符数组转短整型

    一.短整型转字符数组 void main() {char num[2];short int a = 299;num[0] = (char)a ;num[1] = (char) (a >> ...

最新文章

  1. js实现当前导航菜单高亮显示
  2. [Win32]IP数据报的首部如何定义
  3. 图像处理与计算机视觉开源软件库及学习站点
  4. SLAM到底解决的是什么问题?
  5. c++学习笔记之异常
  6. mysql三:表操作
  7. python 清屏_Python学前准备如果你知道要去哪,那么全世界都给你让路
  8. 4月18日 MySQL学习
  9. oracle 监听加密 tcps,通过oracle wallet配置listener tcps加密
  10. Mono SVN最新代码或者Mono 1.2.5 支持IronPython 2.0
  11. validate参数校验和数据回显
  12. 用了10年海尔家电,青岛一音乐老师为海尔写了1首歌
  13. POJ 2068 NIm (dp博弈,每个人都有特定的取最大值)
  14. 物联网智能电影院- Android
  15. 苹果锁定计算机的快捷键,苹果电脑快捷键使用 Mac快捷键大全详细介绍
  16. 计算机网络操作系统的主要功能和类型,操作系统的五大管理功能和四大分类
  17. c#连续打印问题,即进销存销售单打印问题完美解决
  18. 黑盒测试与白盒测试(结合例子详细讲解)
  19. msvcr100.dll丢失的解决方法,哪种解决方法值得推荐?
  20. html计时加速,HTML-加速、再加速

热门文章

  1. Flex布局实现筛子3
  2. 下拉框怎么获取label_拼多多-「关键词自然流量快速获取」访客暴涨秘诀
  3. 计算机组成原理—Cache写策略
  4. JAVA I/O基本操作
  5. 假设系统中共有5个{P0,P1,P2,P3,P4}和A,B,C三类资源;A类资源共有10个,B类资源共有5个,C类资源共有7个。在时刻T0,系统资源分配情况如下表8-14所示。
  6. “玲珑杯”郑州轻工业学院第八届ACM程序设计大赛Problem G: 蛤玮点菜
  7. Digilent提供的Pmod AD5驱动程序
  8. (Electronic WorkBench)EWB仿真JK触发器
  9. centos7 卸载 jdk
  10. python使用小记2-csv文件处理