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.运行结果

[img]http://dl2.iteye.com/upload/attachment/0128/3800/4ba7e102-916c-396c-93ea-74ea4e71305f.jpg[/img]

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


以上仅仅作为学习记录!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值