java基本类型编解码

java 基本类型编解码
---------------------------------------------------
1.单字节编码就没有啥编解码问题了

2.多字节编辑码
  1)big-endian 低地址存储高位
  2)little-endian 低地址存储地位
  3)针对不同的方式进行相应的解码就可以得到相应的数据,如果根据相反的方式及得不到相应的解码数据
3.数值的编辑码无非数值的左右移动得到相应的字节,放到相应的位置以及进行|操作

4.根据tcp/ip socket编程内容进行long类型编辑码





package com.pjf.echodemo;

import java.io.IOException;
import java.math.BigDecimal;

public class EncodeDecodeDemo {

	public static void main(String[] args) throws Exception {

		long data = 123456787654321l;

		//以十六进行展示
		System.out.println(Long.toHexString(data));
		
		//以二进制展示
		System.out.println(Long.toBinaryString(data));
		
		//以十进制展示
		System.out.println(printByteDecByLong(data, 1));
		System.out.println(printByteDecByLong(data, 0));
		
		
		System.out.println("==============高低位======================");
		//将一个long转成高低位数组
		byte[] bytes = longToByteArrayWithBigEndian(data);
		//以高低位的方式将数据进行解析
		System.out.println(readUnsignedLong(byteArrayToLongWithBigEndian(bytes)));
		System.out.println("==============高低位======================");
		
		
		System.out.println("==============低高位======================");
		//将一个long转成地高位数组
		byte[] littleBytes = longToByteArrayWithLittleEndian(data);
		System.out.println(byteArrayToLongWithLittleEndian(littleBytes));
		System.out.println("==============低高位======================");

		

		
//		System.out.println(byteArrayToLongWithBigEndian(bytes));
//		System.out.println(byteArrayToLongWithLittleEndian(bytes));

		
 
				

	}



	/***
	 * 将一个字节数组以10进制数据展示出来
	 */

	/***
	 * 
	 * @param data
	 *            需要处理的数据
	 * @param type
	 *            0:小字节序发的方式打印,其他的方式已大字节序方式打印
	 * @return
	 */
	public static String printByteDecByLong(long data, int type) {
		byte[] bytes = null;
		if (type == 0) {
			bytes = longToByteArrayWithLittleEndian(data);
		} else {
			bytes = longToByteArrayWithBigEndian(data);

		}

		StringBuilder sb = new StringBuilder();
		for (byte b : bytes) {
			sb.append(b & 0xff).append(" ");
		}

		return sb.toString();
	}

	/**
	 * 将long转成一个字节数组[字节序是大端] 高位在低地址位上
	 */
	public static byte[] longToByteArrayWithBigEndian(long a) {
		return new byte[] { (byte) ((a >> 56) & 0xFF), (byte) ((a >> 48) & 0xFF), (byte) ((a >> 40) & 0xFF),
				(byte) ((a >> 32) & 0xFF), (byte) ((a >> 24) & 0xFF), (byte) ((a >> 16) & 0xFF),
				(byte) ((a >> 8) & 0xFF), (byte) (a & 0xFF) };

	}

	/**
	 * 将long转成一个字节数组[字节序是小端] 高位在低地址位上
	 */
	public static byte[] longToByteArrayWithLittleEndian(long a) {

		return new byte[] { (byte) (a & 0xFF), (byte) ((a >> 8) & 0xFF), (byte) ((a >> 16) & 0xFF),
				(byte) ((a >> 24) & 0xFF), (byte) ((a >> 32) & 0xFF), (byte) ((a >> 40) & 0xFF),
				(byte) ((a >> 48) & 0xFF), (byte) ((a >> 56) & 0xFF) };
	}
	
	

	/**
	 * 
	 * @param bytes
	 *            字节数
	 * @return
	 */
	public static long byteArrayToLongWithBigEndian(byte[] bytes) {
		// return b[3] & 0xFF |
		// (b[2] & 0xFF) << 8 |
		// (b[1] & 0xFF) << 16 |
		// b[0] & 0xFF) << 24;

		return (bytes[0] & (long) 0xFF) << 56 | (bytes[1] & (long) 0xFF) << 48 | (bytes[2] & (long) 0xFF) << 40
				| (bytes[3] & (long) 0xFF) << 32 | (bytes[4] & (long) 0xFF) << 24 | (bytes[5] & (long) 0xFF) << 16
				| (bytes[6] & (long) 0xFF) << 8 | (bytes[7] & (long) 0xFF) << 0;
		// long data = 0;
		// int cnt = 8 - bytes.length;
		// /**不够位进行补位*/
		// int i=0;
		// for ( i = 0; i < cnt; i++) {
		//
		// data = data | (0 & 0xFF) <<( 8 * (8-i));
		// }
		// /***
		// * bytes已大端字节序进行转换
		// */
		// for(int j=0;j<=bytes.length-1;j++){
		//
		// data = data | ((bytes[j] & 0xFF) << (8 * (8-i-j-1)));
		//
		// }

		// return data;
	}
	/***
	 * 
	 * @param bytes  字节数据  little-endian
	 * @return 
	 */
	public static long byteArrayToLongWithLittleEndian(byte[] bytes) {
 		return (bytes[0] & (long) 0xFF) << 0 | (bytes[1] & (long) 0xFF) << 8 | (bytes[2] & (long) 0xFF) << 16
				| (bytes[3] & (long) 0xFF) << 24 | (bytes[4] & (long) 0xFF) << 32 | (bytes[5] & (long) 0xFF) << 40
				| (bytes[6] & (long) 0xFF) << 48 | (bytes[7] & (long) 0xFF) << 56;
	}

	 
	
	/**
	 * 
	 * @param value 有符号的long数据
	 * @return 将有符号的long类型数据转成无符号的数据
	 * @throws IOException
	 */
	public static final BigDecimal readUnsignedLong(long value) throws IOException {
		  if (value >= 0)
		   return new BigDecimal(value);
		  long lowValue = value & 0x7fffffffffffffffL;
		  return BigDecimal.valueOf(lowValue).add(BigDecimal.valueOf(Long.MAX_VALUE)).add(BigDecimal.valueOf(1));
		 }
	
	
}












5.运行结果



6.java数值类型转换规则
如果最初的数值类型是有符号的,那么就执行符号扩展;如果是char类型,那么不管它要被转换成什么类型,都执行零扩展。还有另外一条规则也需要记住,如果目标类型的长度小于源类型的长度,则直接截取目标类型的长度。例如将int型转换成byte型,直接截取int型的右边8位。



以上仅仅作为学习记录!

猜你喜欢

转载自pengjianf-ah.iteye.com/blog/2406612