java中的byte运算

package test;

public class A {
	public static void main(String[] args) {
		//前提:在java中,默认都是int型
		//负数在计算机中用补码表示,转换规则为
		//十进求二进制负数情况
		//		先求出与该负数相对应正整数二进制代码,然后所有位取反(不管符号位),末尾加1,不够位数时左边补1。
		//二进制求十进制负数情况
		//		如果首位是1,表明是负整数。将所有位取反(不管符号位),末尾加1,所得数字就是该负数的绝对值。
		System.out.println((byte) -129); 	// 结果显示127
											// 129的二进制 为 1000 0001,因为是-129,根据补码运算规则,得到-129的补码表示 0111 1111,因此计算结果显示为127

		byte t = -120;  //120的二进制为 0111 1000,因为为(-120),根据补码运算得到1000 1000,这是在计算机内部的表示
		System.out.println(Integer.toBinaryString(t)); // t转为整形,因为1000 1000为负数,所以需要在前面补充1, 显示结果为:1111111111111111111111110001000

		int t2 = (byte) 136 & 0xff; //运算步骤,136在java中默认是int类型,为  00000000 00000000 00000000 10001000,强制转为byte后,为1000 1000,
									//与  0xff 运算后(0xff为int类型),又变成int类型 00000000 00000000 00000000 10001000
		System.out.println((byte) t2); // 强制转换后为 1000 1000,因为是负数,根据补码的表示规则为 0111 1000,为120,因为原始为负数,所以结果为-120
		System.out.println(t2 + " " + Integer.toBinaryString(t2)); // 显示结果为 136 10001000,说明如果是证书,int前面的0不显示 
	}

	// 整形转byte数组
	public static byte[] int2Bytes(int a) {

		byte[] b = new byte[4];
		b[0] = (byte) (a >> 24);
		b[1] = (byte) (a >> 16);
		b[2] = (byte) (a >> 8);
		b[3] = (byte) (a);

		return b;
	}

	public static int bytes2Int(byte[] b) {
		return ((b[0] & 0xff) << 24) | ((b[1] & 0xff) << 16)
				| ((b[2] & 0xff) << 8) | (b[3] & 0xff);
	}
}



工具函数:


/**
 * java basic number types:
 * long => 64 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 
 * int  => 32 -2,147,483,648 ~ 2,147,483,647 
 * short=> 16 -32,768 ~ 32,767 
 * byte =>  8 -128~127
 */

public class Test {
	
	private static char[] hex_chars = new char[]{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
	
	private static int ONE_BYTE_MASK = 0XFF; //255
	
	//byte数组填充0
	public static void fillWithNUL(byte[] b)
	{
		for(int i=0; i<b.length; ++i)
		{
			b[i] = 0x00; //16进制表示
		}
	}
	
	//byte数组逆序
	public static byte[] reverse(byte[] b)
	{
		byte[] b1 = new byte[b.length];
		int index = 0;
		for(int i=b.length-1; i>=0; --i)
		{
			b1[index] = b[i];
			++index;
		}
		return b1;
	}
	
	//两个数组是否相等
	public static boolean byteArrayEquals(byte[] array1,int array1off,
			byte[] array2,int array2off,int len)
	{
	    for (int i = 0; i < len; ++i)
	    	if (array1[array1off+i] != array2[array2off+i])
	    		return false;
	    return true;
	}
	
	//byte转成int
	public static int onebyte2int(byte[] b, int off)
	{
		return (0xFF & b[off]); //0xFF java数字默认是int类型的
	}
	
	//int型转为byte
	public static void int2onebyte(int n, byte[] b, int off) throws Exception
	{
		if(!(n>=0 && n<=255)) 
			throw new Exception(n+" exceed unsigned char range [0,255]!");
		b[off] = 0x00;
		b[off] |= n;
	}
	
	//两个byte转成int
	public static int twobyte2int(byte[] b, int off)
	{
		int n = 0;
		n |= ( 0xFF & b[off] ) << 8;
		n |= ( 0xFF & b[off+1] );
		return n;
	}
	
	//int转为byte
	public static void int2twobyte(int n, byte[] b, int off) throws Exception
	{
		if(!(n>=0 && n<=65535)) 
			throw new Exception(n+" exceed unsigned short int range [0,65535]!");
		b[off]   = 0x00;
		b[off+1] = 0x00;
		b[off]   |= (n >> 8);
		b[off+1] |= n;
	}
	
	//三组byte转为整形
	public static int threebyte2int(byte[] b, int off)
	{
		int n = 0;
		n |= ( 0xFF & b[off] )   << 16;
		n |= ( 0xFF & b[off+1] ) << 8;
		n |= ( 0xFF & b[off+2] );
		return n;
	}
	
	//int转为三组byte
	public static void int2threebyte(int n, byte[] b, int off) throws Exception
	{
		if(!(n>=0 && n<=0xFFFFFF)) 
			throw new Exception(n+" exceed unsigned short int range [0,16777215]!");
		b[off]   = 0x00;
		b[off+1] = 0x00;
		b[off+2] = 0x00;
		b[off]   |= (n >> 16);
		b[off+1] |= (n >> 8);
		b[off+2] |= n;
	}
	
	//4组byte转成long
	public static long fourbyte2long(byte[] b, int off)
	{
		long n = 0L;
		n |= ( 0xFFL & b[off] )   << 24;
		n |= ( 0xFFL & b[off+1] ) << 16;
		n |= ( 0xFFL & b[off+2] ) << 8;
		n |= ( 0xFFL & b[off+3] );
		return n;
	}
	
	//long转到4个数组中
	public static void long2fourbyte(long n, byte[] b, int off) throws Exception
	{
		if(!(n>=0 && n<=4294967295L)) 
			throw new Exception(n+" exceed unsigned long int range [0,4294967295]!");
		b[off]   = 0x00;
		b[off+1] = 0x00;
		b[off+2] = 0x00;
		b[off+3] = 0x00;
		b[off]   |= (n >> 24);
		b[off+1] |= (n >> 16);
		b[off+2] |= (n >> 8);
		b[off+3] |= n;
	}
	
	//四组byte转int
	public static int byte2int(byte[] b)
	{
		if(b==null || b.length!=4) 
			return -1;
		int mask = 0xff;
		int temp = 0;
		int res = 0;
		for (int i = 0; i < 4; i++) {
			res <<= 8; //左移8位,为0不变
			temp = b[i] & mask;
			res |= temp;
		}
		return res;
	}
	
	//int转为byte数组
	public static byte[] int2byte(int n) 
	{
		int mask = 0xff;
		byte[] b = new byte[4];
		b[3] = (byte)(n & mask); //强转 
		b[2] = (byte)(n >> 8 & mask);
		b[1] = (byte)(n >> 16 & mask);
		b[0] = (byte)(n >> 24 & mask);
		return b;
	}
	
	//byte转short
	public static short byte2short(byte[] b) 
	{
		if(b==null || b.length!=2) return -1;
		int mask = 0xff;
		int temp = 0;
		short res = 0;
		for (int i = 0; i < 2; i++) {
			res <<= 8;
			temp = b[i] & mask;
			res |= temp;
		}
		return res;
	}
	
	//short转为byte
	public static byte[] short2byte(short n) 
	{
		byte[] b = new byte[2];
		b[1] = (byte)(n & 0xff);
		b[0] = (byte)(n >> 8 & 0xff);
		return b;
	}
	
	//数组拷贝
	public byte[] subArray(byte[] byte_array,int off,int len)
	{
		byte[] result = new byte[len];
		System.arraycopy(byte_array, off, result, 0, len); //源数组,起始位置,目的数组,起始位置,长度
		return result;
	}
	
	//byte数组转为16进制,利用 hex_chars 数组
	public static String byte2hex(byte[] byte_array,int off,int len)
	{
		StringBuilder sb = new StringBuilder();
		for(int i=off; i<off+len; ++i)
		{
			byte temp = byte_array[i];
			sb.append( hex_chars[ temp>>>4 & 0X0F ] ); //无符号右移,左侧补0
			sb.append( hex_chars[ temp & 0X0F ] );
		}
		return sb.toString();
	}
	
	public static String byte2hex(byte[] byte_array)
	{
		StringBuilder sb = new StringBuilder();
		for(int i=0; i<byte_array.length; ++i)
		{
			byte temp = byte_array[i];
			sb.append( hex_chars[ temp>>>4 & 0X0F ] );
			sb.append( hex_chars[ temp & 0X0F ] );
		}
		return sb.toString();
	}
	
	public static String byte2hexWithBlank(byte[] byte_array)
	{
		if(byte_array==null) return "";
		StringBuilder sb = new StringBuilder();
		for(int i=0; i<byte_array.length; ++i)
		{
			byte temp = byte_array[i];
			sb.append( hex_chars[ temp>>>4 & 0X0F ] );
			sb.append( hex_chars[ temp & 0X0F ] );
			sb.append(" ");
		}
		return sb.toString();
	}
	
	//16进制字符串转byte数组
	public static byte[] hex2byte(String hexString) throws Exception
	{
		byte[] hexStrBytes = hexString.getBytes();
		
		if(hexStrBytes.length % 2 != 0) 
			throw new IllegalArgumentException("["+hexString+"] lengh is even");

		byte[] bytes = new byte[hexStrBytes.length/2];
		for(int i=0; i<hexStrBytes.length; i+=2 )
		{
			String item = new String(hexStrBytes,i,2);
			int2onebyte(Integer.parseInt(item,16),bytes,i/2); 
		}
		return bytes;
	}
	
	public static byte[] hex2byteWithBlank(String hexStringWithBlank) throws Exception
	{
		hexStringWithBlank = hexStringWithBlank.replaceAll(" ", "");
		return hex2byte(hexStringWithBlank);
	}
	
	//两个数组是否相等
	public static boolean equals(byte[] b1,byte[] b2)
	{
		return Arrays.equals(b1, b2);
	}
	
	//
	public static String revertStringFromBytes(byte[] ba)
	{
		int index = 0;
		for(int i=0; i<ba.length; ++i)
		{
			if(ba[i]=='\0')
			{
				index = i;
				break;
			}
		}
		return new String(ba,0,index); //转为
	}

	public static void main(String[] args) throws Exception{
		int i=10;
		System.out.println("10转16进制=="+Integer.toHexString(i)); //a,返回的都是str
		System.out.println("10转8进制=="+Integer.toOctalString(i)); //12
		System.out.println("10转2进制=="+Integer.toBinaryString(i)); //1010
		
		String str1 = "A";
		System.out.println("16转10进制=="+Integer.parseInt(str1, 16)); //10 结果是int
		String str2 = "12";
		System.out.println("16转10进制=="+Integer.parseInt(str2, 8)); //10 结果是int
		String str3 = "1010";
		System.out.println("16转10进制=="+Integer.parseInt(str3, 2)); //10 结果是int
	}
}



  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值