package first;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
public class GetLongFromStream {
public static void main(String args[]) throws IOException{
byte[] buf = new byte[8];
System.out.println(Long.MAX_VALUE);
encoding(Long.MAX_VALUE,buf,0,8);
System.out.println(decodings(buf, 0, 8));
//set();
}
/**
* 将long 转成 字数组,buf存放位数从高倒低
* 思路:buf[0]放最高位,那么就想法得到最高位,那么就c向移7位,就剩下最高的那个字节,
* 那么问题是怎么取第二高位,其实很简单,我们将c向右移6位,剩下最高的两个字节,我们再 (byte)取低位的那个字节,
* 依此类推,就能得到所有的字节
* @param c
* @param buf 存放结果
* @param off 开始位置
* @param size 占用的字节数
*/
public static void encoding(long c,byte[]buf,int off,int size) {
for(int i=0;i<size;i++) {
buf[off++] = (byte)(c>>((size-i-1)*8));
}
}
public static long decoding(byte[]buf,int off,int len) {
long ret = 0;
for(int i=0;i<len;i++) {
ret = (ret<<8)|((long)buf[off+i]&0xff);
}
return ret;
}
/**
* 将 byte[] 数组存放的二进制表示成相应的值
* 思路:buf[0]为最高位,那么将其左移7位,buf[1]左移6位,两它们合成一个数的方法是前者与
* 后者 相或(|),上面的那个方法更好点
* @param buf
* @param off 开始位置
* @param size 结果要占用的字节
* @return
*/
public static long decodings(byte[]buf,int off,int size) {
long ret = 0;
for(int i=size-1;i>=0;i--) {
ret = ret|((long)buf[off++]&0xff)<<(i*8);
}
return ret;
}
/**
* 运算顺序
* 单元
* 算术移位
* 关系
* 逻辑
* 条件
* 赋值
*/
public static void set() {
System.out.println(1&0xff<<7);
System.out.println(2-1<<7);
System.out.println(2>1);
System.out.println((byte)1+127);
}
}
将基本类型进行编码
最新推荐文章于 2024-07-21 00:15:00 发布