First.先来介绍一下JAVA的整数类型
JAVA中整数类型有:
- short(二字节)
- int(四字节)
- long(八字节)
字节数组的声明以及接收方式
byte [] bytes = new byte[4];
十进制数(也就是我们平常使用的进制)16
0x10 十六进制(也叫HEX)表示方式 可以在JAVA中直接声明,byte num=0x10;
但这里有个问题,如果你直接声明num=0xd1会报错,这是为什么呢?
因为byte的取值范围是-128到+127,而0xd1是209,超过了byte取值范围,这里的0xd1 需要强制类型转换,所以我们需要这样写:
byte num = (byte)0xd1;
在字节换算上,我们可以直接使用计算机自带的计算器进行进制转换;
如何将一个byte类型的数据转换为int类型?
很简单,只需要&0xff,即可将一个byte类型的数字转换为int
比如:
byte num=0x10;
int num1=0x10&0xff;
**为什么要&0xff**
byte[0] = "A3"(十六进制表示) 但是在debug时显示的是 -93 ,而如果直接赋值给int的变量也是-93.当然大部分人都知道这是不能直接赋值的。所以要&0xff
如何将一个byte数组转换为字符串(HexString)?
byte [] bArray=new byte[]{0x10,(byte)0xd0,(byte)0xe1,(byte)0x01}:
StringBuffer sb = new StringBuffer(bArray.length);//便于后面的拼接用
String sTemp;//临时变量
for (int i = 0; i < bArray.length; i++) {
sTemp = Integer.toHexString(0xFF & bArray[i]);//第一步:把数组里面的每个值转换为int类型
if (sTemp.length() < 2){ //一个字节至少两位数,所以少于两位的前面填充0
sb.append(0);
}
sb.append(sTemp.toUpperCase());//统一改成小写
}
return sb.toString();
所以我们得出结论,byte转为字符串,只能先转为int,再做处理。
如何将一个int类型转为byte[]类型
因为byte只有8bit因此需要byte[4]数组存储这个int
如果是short 则是byte[2]
long 则是 byte[8]
byte [] bytes =new byte[4] ;
int temp = 1009020;
bytes[0] = (byte)(temp >> 24 & 0xFF);
bytes[1] = (byte)(temp >> 16 & 0xFF);
bytes[3] = (byte)(temp >> 8 & 0xFF);
bytes[4] = (byte)(temp & 0xFF);
如何将一个byte[]类型转为int类型
因为byte只有8bit因此需要byte[4]数组存储这个int
如果是short 则是byte[2]
long 则是 byte[8]
int value=0;
value +=(bytes[i] & 0xFF) << 24;
value +=(bytes[i] & 0xFF) << 16;
value +=(bytes[i] & 0xFF) << 8;
value +=(bytes[i] & 0xFF) ;
return value;
注意一定要记住
或者
( (bytes[3] & 0xff) << 24 | (bytes[2] & 0xff) << 16 | (bytes[1] & 0xff) << 8 | bytes[0] & 0xff) )
int 转byte[] 先右移再&0xff,byte[]转int先&0xff再左移!
JAVA中大端小端的转换
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
数据举例说明:
*下面以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value
Big-Endian: 低地址存放高位,如下:
高地址
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
低地址
Little-Endian: 低地址存放低位,如下:
高地址
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
--------------
低地址
内存地址 小端模式存放内容 大端模式存放内容
0x4000 0x78 0x12
0x4001 0x56 0x34
0x4002 0x34 0x56
0x4003 0x12 0x78*
//由高位到地位 也就是大端转换
byte [] bytes =new byte[4] ;
int temp = 1009020;
bytes[0] = (byte)(temp >> 24 & 0xFF);
bytes[1] = (byte)(temp >> 16 & 0xFF);
bytes[3] = (byte)(temp >> 8 & 0xFF);
bytes[4] = (byte)(temp & 0xFF);
//由地位到高位 也就是小端转换
byte [] bytes =new byte[4] ;
int temp = 1009020;
bytes[4] = (byte)(temp & 0xFF);
bytes[3] = (byte)(temp >> 8 & 0xFF);
bytes[1] = (byte)(temp >> 16 & 0xFF);
bytes[0] = (byte)(temp >> 24 & 0xFF);
这是int上的转换,如果是比int的最大值还要大的值,这时候我们就可以用long来接收/转换,大家也可以写一个通用的方法, bytes[i] = (byte)(temp >> i*8 & 0xFF); 这样就可以省写好多代码
//由高位到地位 也就是大端转换
byte [] bytes =new byte[8] ;
long temp = 1009020999999999L;
bytes[0] = (byte)(temp >> 56 & 0xFF);//8*7
bytes[1] = (byte)(temp >> 48 & 0xFF);//8*6
bytes[2] = (byte)(temp >> 40 & 0xFF);//8*5
bytes[3] = (byte)(temp >> 32 & 0xFF);//8*4
bytes[4] = (byte)(temp >> 24 & 0xFF);//8*3
bytes[5] = (byte)(temp >> 16 & 0xFF);//8*2
bytes[6] = (byte)(temp >> 8 & 0xFF);//8*1
bytes[7] = (byte)(temp & 0xFF);
JAVA默认是大端传输,那么遇到7字节数小端转换我们怎么处理呢?因为7字节数既不是int也不是long
既然JAVA已经大端转换完成,那我们可以直接反转字节位置即可,数组下标0的转移到6,1转移到5···
代码如下:
那我们就可以称这段代码为万能 大端->小端 代码
byte [] bytes1=new byte[data.length];
for(int i=0;i<data.length;i++){
bytes1[i]=data[data.length-1-i];
}
ASCII码是什么?在JAVA中如何表示,如何转换为字符串?
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示 ,来自百度百科。
其实就是一套包含标点符号、特殊符号的一套编码规则,一般用于通讯时存储一些带特殊符号格式的数据,比如ip地址端口号221.220.49.40:8080 等
在JAVA中如何表示?
字符串 1234567890abcdef
表示方式如下:
public static final byte[] pwd =new byte[]{(byte)0x31,(byte)0x32 ,(byte)0x33 ,(byte)0x34,(byte)0x35 ,
(byte)0x36, (byte)0x37 ,(byte)0x38, (byte)0x39 ,(byte)0x30, (byte)0x61 ,(byte)0x62, (byte)0x63, (byte)0x64 ,(byte)0x65 ,(byte)0x66};
也是需要声明字节数组来存储变量。
如何转为字符串格式呢?
String str = new String(bytes);
这样直接声明就可以直接还原原来数据,还是比较方便的。
这篇文章先总结到这,如果遇到新知识我还会逐步添加,如果写的有什么问题,或者有什么意见,请大家不吝指教