JAVA中整数与C语言中十六进制的转换知识整合

First.先来介绍一下JAVA的整数类型

JAVA中整数类型有:

  1. short(二字节)
  2. int(四字节)
  3. 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);

这样直接声明就可以直接还原原来数据,还是比较方便的。

这篇文章先总结到这,如果遇到新知识我还会逐步添加,如果写的有什么问题,或者有什么意见,请大家不吝指教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值