Java基础数据类型二进制转换
Java基本数据类型与表示范围(boolean忽略)
1,byte(整型):8位,short(整型):16位,char(字符型):16位,int(整型):32位,float(浮点型单精度):32位,long(整型):64位,double(浮点型双精度):64位。
2,直接按位做比例运算,一个short数字或char字符可有两个byte数字表示,一个float或int数字可由4个byte数字表示,一个long或double数字可由8个byte数字表示。
3,以2进制数表示范围计算得到各整型数值表示范围,每种数值类型的最大表示范围可以通过包装类的静态属性取到,比如Integer.MAX_VALUE。
4,char类型是最具话题性的数据类型,它承担着整个语言世界的符号统统转换称为计算机所认识的编码格式的重任,关于字符集和编码包含了很多概念也带来了很多问题。
二进制与编码
一般对英文字符而言,一个字节表示一个字符,但是对汉字而言,由于低位的编码已经被使用(早期计算机并不支持中文,因此为了扩展支持,唯一的办法就是采用更多的字节数)只好向高位扩展。
一般字符集编码的范围 utf-8>gbk>iso-8859-1(latin1)>ascll。ascll编码是美国标准信息交换码的英文缩写,包含了常用的字符,如阿拉伯数字,英文字母和一些打印符号,请注意字符和数字的区别,比如'0'字符对应的十进制数字是48。
unicode编码包含很多种格式,utf-8是其中最常用的一种,utf-8名称的来自于该编码使用8位一个字节表示一个字符。对于一个汉字而言,它需要3个字节表示一个汉字,但大中华地区人民表示不服,搞一套gbk编码格式,用两个字节表示一个汉字。
乱码问题:
乱码问题的根源在于信息解码和编码时使用的格式不统一
@Testpublic void demo(){// 0100&0100=0100assertEquals(4,4&4);// 1000&0100=0000assertEquals(0,4&8);// 字符'0'用十进制数48表示char c = '0';int i = c;assertEquals(48,i);// 认识 0xf, 0xff, 0xffff. f对应16进制数字15, 二进制1111byte b = Byte.MAX_VALUE;assertEquals(127,b);assertEquals(127,b & 0xff);assertEquals(15,b & 0xf);byte b1 = -1;// 说明-1是按照默认的(byte)b1=0xff与0xff计算后转换为int值 = 255assertEquals(255, (byte)b1&0xff);assertEquals(255, b1&0xff);// 255转换为byte 结果为-1assertEquals(-1, (byte)(b1&0xff));// b1不强制转换编译器会报错. 0xff超过byte表示范围转为byte值得到-1byte bf = (byte) 0xff;assertEquals(bf, -1);// 0xf2 = 11110010// 符号位不变取反+1 = 10001101+00000001 = 10001110 = -14assertEquals(-14, (byte)0xf2);}@Testpublic void demo(){// 0100&0100=0100assertEquals(4,4&4);// 1000&0100=0000assertEquals(0,4&8);// 字符'0'用十进制数48表示char c = '0';int i = c;assertEquals(48,i);// 认识 0xf, 0xff, 0xffff. f对应16进制数字15, 二进制1111byte b = Byte.MAX_VALUE;assertEquals(127,b);assertEquals(127,b & 0xff);assertEquals(15,b & 0xf);byte b1 = -1;// 说明-1是按照默认的(byte)b1=0xff与0xff计算后转换为int值 = 255assertEquals(255, (byte)b1&0xff);assertEquals(255, b1&0xff);// 255转换为byte 结果为-1assertEquals(-1, (byte)(b1&0xff));// b1不强制转换编译器会报错. 0xff超过byte表示范围转为byte值得到-1byte bf = (byte) 0xff;assertEquals(bf, -1);// 0xf2 = 11110010// 符号位不变取反+1 = 10001101+00000001 = 10001110 = -14assertEquals(-14, (byte)0xf2);}
上面的代码包含了几个基本的运算和转换的示例。
二进制与其它类型直接的转换
工具类ByteUtils.java(为方便了解进制转换,各个方法参数都不包含index,如果要作为工具使用,请自行修改)
package org.wit.ff.common;/*** * <pre>* 基本数据类型转换(主要是byte和其它类型之间的互转).* </pre>** @author F.Fang* @version $Id: ByteUtils.java, v 0.1 2014年11月9日 下午11:23:21 F.Fang Exp $*/
public class ByteUtils {/*** * <pre>* 将4个byte数字组成的数组合并为一个float数.* </pre>* * @param arr* @return*/public static float byte4ToFloat(byte[] arr) {if (arr == null || arr.length != 4) {throw new IllegalArgumentException("byte数组必须不为空,并且是4位!");}int i = byte4ToInt(arr);return Float.intBitsToFloat(i);}/*** * <pre>* 将一个float数字转换为4个byte数字组成的数组.* </pre>* * @param f* @return*/public static byte[] floatToByte4(float f) {int i = Float.floatToIntBits(f);return intToByte4(i);}/*** * <pre>* 将八个byte数字组成的数组转换为一个double数字.* </pre>* * @param arr* @return*/public static double byte8ToDouble(byte[] arr) {if (arr == null || arr.length != 8) {throw new IllegalArgumentException("byte数组必须不为空,并且是8位!");}long l = byte8ToLong(arr);return Double.longBitsToDouble(l);}/*** * <pre>* 将一个double数字转换为8个byte数字组成的数组.* </pre>* * @param i* @return*/public static byte[] doubleToByte8(double i) {long j = Double.doubleToLongBits(i);return longToByte8(j);}/*** * <pre>* 将一个char字符转换为两个byte数字转换为的数组.* </pre>* * @param c* @return*/public static byte[] charToByte2(char c) {byte[] arr = new byte[2];arr[0] = (byte) (c >> 8);arr[1] = (byte) (c & 0xff);return arr;}/*** * <pre>* 将2个byte数字组成的数组转换为一个char字符.* </pre>* * @param arr* @return*/public static char byte2ToChar(byte[] arr) {if (arr == null || arr.length != 2) {throw new IllegalArgumentException("byte数组必须不为空,并且是2位!");}return (char) (((char) (arr[0] << 8)) | ((char) arr[1]));}/*** * <pre>* 将一个16位的short转换为长度为2的8位byte数组.* </pre>* * @param s* @return*/public static byte[] shortToByte2(Short s) {byte[] arr = new byte[2];arr[0] = (byte) (s >> 8);arr[1] = (byte) (s & 0xff);return arr;}/*** * <pre>* 长度为2的8位byte数组转换为一个16位short数字.* </pre>* * @param arr* @return*/public static short byte2ToShort(byte[] arr) {if (arr != null && arr.length != 2) {throw new IllegalArgumentException("byte数组必须不为空,并且是2位!");}return (short) (((short) arr[0] << 8) | ((short) arr[1] & 0xff));}/*** * <pre>* 将short转换为长度为16的byte数组.* 实际上每个8位byte只存储了一个0或1的数字* 比较浪费.* </pre>* * @param s* @return*/public static byte[] shortToByte16(short s) {byte[] arr = new byte[16];for (int i = 15; i >= 0; i--) {arr[i] = (byte) (s & 1);s >>= 1;}return arr;}public static short byte16ToShort(byte[] arr) {if (arr == null || arr.length != 16) {throw new IllegalArgumentException("byte数组必须不为空,并且长度为16!");}short sum = 0;for (int i = 0; i < 16; ++i) {sum |= (arr[i] << (15 - i));}return sum;}/*** * <pre>* 将32位int转换为由四个8位byte数字.* </pre>* * @param sum* @return*/public static byte[] intToByte4(int sum) {byte[] arr = new byte[4];arr[0] = (byte) (sum >> 24);arr[1] = (byte) (sum >> 16);arr[2] = (byte) (sum >> 8);arr[3] = (byte) (sum & 0xff);return arr;}/*** <pre>* 将长度为4的8位byte数组转换为32位int.* </pre>* * @param arr* @return*/public static int byte4ToInt(byte[] arr) {if (arr == null || arr.length != 4) {throw new IllegalArgumentException("byte数组必须不为空,并且是4位!");}return (int) (((arr[0] & 0xff) << 24) | ((arr[1] & 0xff) << 16) | ((arr[2] & 0xff) << 8) | ((arr[3] & 0xff)));}/*** * <pre>* 将长度为8的8位byte数组转换为64位long.* </pre>* * 0xff对应16进制,f代表1111,0xff刚好是8位 byte[]* arr,byte[i]&0xff刚好满足一位byte计算,不会导致数据丢失. 如果是int计算. int[] arr,arr[i]&0xffff* * @param arr* @return*/public static long byte8ToLong(byte[] arr) {if (arr == null || arr.length != 8) {throw new IllegalArgumentException("byte数组必须不为空,并且是8位!");}return (long) (((long) (arr[0] & 0xff) << 56) | ((long) (arr[1] & 0xff) << 48) | ((long) (arr[2] & 0xff) << 40)| ((long) (arr[3] & 0xff) << 32) | ((long) (arr[4] & 0xff) << 24)| ((long) (arr[5] & 0xff) << 16) | ((long) (arr[6] & 0xff) << 8) | ((long) (arr[7] & 0xff)));}/*** 将一个long数字转换为8个byte数组组成的数组.*/public static byte[] longToByte8(long sum) {byte[] arr = new byte[8];arr[0] = (byte) (sum >> 56);arr[1] = (byte) (sum >> 48);arr[2] = (byte) (sum >> 40);arr[3] = (byte) (sum >> 32);arr[4] = (byte) (sum >> 24);arr[5] = (byte) (sum >> 16);arr[6] = (byte) (sum >> 8);arr[7] = (byte) (sum & 0xff);return arr;}/*** * <pre>* 将int转换为32位byte.* 实际上每个8位byte只存储了一个0或1的数字* 比较浪费.* </pre>* * @param num* @return*/public static byte[] intToByte32(int num) {byte[] arr = new byte[32];for (int i = 31; i >= 0; i--) {// &1 也可以改为num&0x01,表示取最地位数字.arr[i] = (byte) (num & 1);// 右移一位.num >>= 1;}return arr;}/*** * <pre>* 将长度为32的byte数组转换为一个int类型值.* 每一个8位byte都只存储了0或1的数字.* </pre>* * @param arr* @return*/public static int byte32ToInt(byte[] arr) {if (arr == null || arr.length != 32) {throw new IllegalArgumentException("byte数组必须不为空,并且长度是32!");}int sum = 0;for (int i = 0; i < 32; ++i) {sum |= (arr[i] << (31 - i));}return sum;}/*** * <pre>* 将长度为64的byte数组转换为一个long类型值.* 每一个8位byte都只存储了0或1的数字.* </pre>* * @param arr* @return*/public static long byte64ToLong(byte[] arr) {if (arr == null || arr.length != 64) {throw new IllegalArgumentException("byte数组必须不为空,并且长度是64!");}long sum = 0L;for (int i = 0; i < 64; ++i) {sum |= ((long) arr[i] << (63 - i));}return sum;}/*** * <pre>* 将一个long值转换为长度为64的8位byte数组.* 每一个8位byte都只存储了0或1的数字.* </pre>* * @param sum* @return*/public static byte[] longToByte64(long sum) {byte[] arr = new byte[64];for (int i = 63; i >= 0; i--) {arr[i] = (byte) (sum & 1);sum >>= 1;}return arr;}}
测试用例:
1,测试基本的移位操作符号.
@Testpublic void op(){// >>>// >>// <<<int i = -1;System.out.println(Arrays.toString(ByteUtils.intToByte32(i)));// 有符号右移,符号位依然存在,右移一位后最左边的最高位补1, -1System.out.println(i >> 1);// 无符号右移,忽略符号位,右移一位后最左边的最高位补0,2147483647 Integer.MAX_VALUESystem.out.println(i >>> 1);// 有符号左移,符号位依然存在,左移一位最低位补0. -2System.out.println(i << 1);// <<<无此符号,因为左移符号位不会丢失,没有必要再增加此操作.}
2,查询最大值最小值.
@Testpublic void showMaxValAndminVal() {// 127System.out.println(Byte.MAX_VALUE);// -128System.out.println(Byte.MIN_VALUE);// 32767System.out.println(Short.MAX_VALUE);// -32768System.out.println(Short.MIN_VALUE);// 65535 2的16次方-1System.out.println((int) Character.MAX_VALUE);// 0System.out.println((int) Character.MIN_VALUE);// 2147483647System.out.println(Integer.MAX_VALUE);// -2147483648System.out.println(Integer.MIN_VALUE);// 科学计数法.// 3.4028235E38System.out.println(Float.MAX_VALUE);// 1.4E-45System.out.println(Float.MIN_VALUE);// 9223372036854775807System.out.println(Long.MAX_VALUE);// -9223372036854775808System.out.println(Long.MIN_VALUE);// 科学计数法.// 1.7976931348623157E308System.out.println(Double.MAX_VALUE);// 4.9E-324System.out.println(Double.MIN_VALUE);}
3,转换测试:
@Testpublic void transByte() {char c = 'z';byte[] charToByte2Arr = ByteUtils.charToByte2(c);assertEquals("[0, 122]", Arrays.toString(charToByte2Arr));assertEquals('z', ByteUtils.byte2ToChar(charToByte2Arr));short s = Short.MAX_VALUE;// System.out.println("Short.MAX_VALUE:" + s);byte[] shortToByte2Arr = ByteUtils.shortToByte2(s);assertEquals("[127, -1]", Arrays.toString(shortToByte2Arr));assertEquals(s, ByteUtils.byte2ToShort(shortToByte2Arr));byte[] shortToByte16 = ByteUtils.shortToByte16(s);System.out.println(Arrays.toString(shortToByte16));System.out.println(ByteUtils.byte16ToShort(shortToByte16));int i = Integer.MAX_VALUE;// System.out.println("Integer.MAX_VALUE:" + i);byte[] intToByte4Arr = ByteUtils.intToByte4(i);assertEquals("[127, -1, -1, -1]", Arrays.toString(intToByte4Arr));assertEquals(i, ByteUtils.byte4ToInt(intToByte4Arr));byte[] intToByte32Arr = ByteUtils.intToByte32(i);System.out.println(Arrays.toString(intToByte32Arr));System.out.println(ByteUtils.byte32ToInt(intToByte32Arr));long j = Long.MAX_VALUE;// System.out.println("Long.MAX_VALUE:" + j);byte[] longToByte8Arr = ByteUtils.longToByte8(j);assertEquals("[127, -1, -1, -1, -1, -1, -1, -1]", Arrays.toString(longToByte8Arr));assertEquals(j, ByteUtils.byte8ToLong(longToByte8Arr));byte[] longToByte64Arr = ByteUtils.longToByte64(j);System.out.println(Arrays.toString(longToByte64Arr));System.out.println(ByteUtils.byte64ToLong(longToByte64Arr));double d = 2.34;byte[] doubleToByte8Arr = ByteUtils.doubleToByte8(d);assertEquals("[64, 2, -72, 81, -21, -123, 30, -72]", Arrays.toString(doubleToByte8Arr));// double类型不能直接做等值比较,只能在精度范围做差值比较.assertEquals(d + "", ByteUtils.byte8ToDouble(doubleToByte8Arr) + "");float f = 1.2f;byte[] floatToByte4Arr = ByteUtils.floatToByte4(f);assertEquals("[63, -103, -103, -102]", Arrays.toString(floatToByte4Arr));assertEquals(f + "", ByteUtils.byte4ToFloat(floatToByte4Arr) + "");}
Java基础数据类型二进制转换相关推荐
- JAVA基础数据类型转化
JAVA基础数据类型转化 1.根据基础数据储存空间可以将基础数据类型做以下排列 //浮点数类型要比整数类型大 // byte,short,char=>int=>long=>float ...
- java整数能强转转字符,Java中数据类型默认转换和强制类型转换
默认转换: a:由低到高一次为:(byte short char )---int ---long ---float --- double b:注意:byte short char ...
- Java 基础 —— 进制转换
文章目录 Java 基础 -- 进制转换 简介 转换说明 10进制转换Demo 算法转换 R进制转进制 扩展:统计输入整数二进制有多少个"1" 需求 扩展:进制转换(输入一个十六进 ...
- java基础----数据类型转化
数据类型的转换是将一个数值从一种数据类型转化成另一种数据类型的过程. Java中数据类型的转换有两种:隐式数据类型转换和显式数据类型转换. 隐式数据类型转换是指系统自动执行,无序程序员显式编程而实现的 ...
- Java 基本数据类型的转换
基本数据类型转换 Java 中数据类型的转换有两种: 1.自动转换: 2.强制转换. Java 中整型和浮点型按照范围从小到大: byte -> short -> int -> lo ...
- java基础数据类型包装类
基础数据类型包装类 当一个程序要求交互式输入一个int类型的年龄时,从文本框中输入的结果肯定是String类型的.要在程序中进行相关操作,它必须先转换为int类型.因此可以使用数据类型的转换或强制转换 ...
- java基础数据类型与String类型区别
区别:Java内存存放位置不一样,基本数据类型存在栈(stack),String的对象实例存在堆(heap).另外String,不是基本数据类型,判断是否相等,不能使用==,而应该使用equals方法 ...
- Java基础-数据类型int,short,char,long,float,double,boolean,byte
Java语言是静态类型的(statical typed),也就是说所有变量和表达式的类型再编译时就已经完全确定.由于是statical typed,导致Java语言也是强类型(Strong typed ...
- 2.JAVA基础——数据类型、变量及运算符
数据类型: 基本类型(四类八种): 数值型 整数类型(byte,short,int,long) 浮点类型(float,double) 字符型char 布尔型boolean 引用类型: 类clas ...
最新文章
- 谁说GPT只擅长生成?清华研究力证:GPT语言理解能力不输BERT
- 基于 Prometheus、InfluxDB 与 Grafana 打造监控平台
- 麦格纳软件公司绩效考核信息化管理解决方案
- BugkuCTF-MISC题多方法解决
- UrlRewriter 伪url的配置
- python 编译procto错误处理
- GDB调试之ptrace实现原理
- 红帽 Red Hat Linux相关产品iso镜像下载【百度云】(转载)
- plus初始化原理及plus is not defined,mui is not defined 错误汇总
- GB2312和ASCII码点阵字库HZK, ASC整理
- 正则系列之手机号码正则
- 基于java自行车租赁管理系统
- matlab 求矩阵各行的平均值
- 大麦无线虚拟服务器,大麦路由器192.168.10.1设置教程
- 国外著名英文搜索引擎大全及分类
- 一切皆是映射:浅谈操作系统内核的缺页异常(Page Fault)
- @ApiOperation
- 一张图片中多个图标如何通过CSS定位显示?
- linux轻量级进程,linux轻量级进程LWP
- 噩梦射手(SurvivalShooter)教程(六)