package com.cn;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Arrays;
public class Test1 {
public static void main(String[] args) throws IOException {
int id = 101; //把id转换为字节数据,一个int占4个字节,
int age = 21;
//int转换为字节数组
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
arrayOutputStream.write(int2bytes(id));
arrayOutputStream.write(int2bytes(age));
byte[] byteArray = arrayOutputStream.toByteArray();//[0, 0, 0, 101, 0, 0, 0, 21]
System.out.println(Arrays.toString(byteArray));
//字节数组转换为int
ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(byteArray);
byte[] idBytes = new byte[4];//id占4个字节
arrayInputStream.read(idBytes);
System.out.println("id:" + bytes2int(idBytes));//id:101
byte[] ageBytes = new byte[4];
arrayInputStream.read(ageBytes);//age占4个字节
System.out.println("age:" + bytes2int(ageBytes));//age:21
}
/**
int转换成字节数组,使用的是大端序列方式。
2种方式:
1.大端字节序列:先写高位,再写低位
2.小端字节序列:先写低位,再写高位
*/
public static byte[] int2bytes(int i){
byte[] bytes = new byte[4]; //int占4个字节
bytes[0] = (byte)(i >> 3*8);//先获取高位,总共4个字节,向右移动3个字节,一个字节8位,
bytes[1] = (byte)(i >> 2*8);
bytes[2] = (byte)(i >> 1*8);
bytes[3] = (byte)(i >> 0*8);
return bytes;//[0, 0, 0, 101],[0, 0, 0, 21]
}
/**
* 把字节数组转换为int。
* int转换为字节数组时候bytes[0]是高位,向左移动3个字节,
*
* 大端序列方式:
*/
public static int bytes2int(byte[] bytes){
return (bytes[0] << 3*8) |
(bytes[1] << 2*8) |
(bytes[2] << 1*8) |
(bytes[3] << 0*8);
}
}
package com.cn;
import java.nio.ByteBuffer;
import java.util.Arrays;
public class Test2 {
public static void main(String[] args) {
int id = 101;
int age = 21;
//序列化
//nio里面的ByteBuffer,申请8个空间,必须给定指定的大小,不会自动扩容。再写数据就会报错超出容量。
ByteBuffer buffer = ByteBuffer.allocate(8);
buffer.putInt(id);
buffer.putInt(age);
byte[] array = buffer.array();
System.out.println(Arrays.toString(buffer.array()));//[0, 0, 0, 101, 0, 0, 0, 21]
//反序列化
ByteBuffer buffer2 = ByteBuffer.wrap(array);
System.out.println("id:"+buffer2.getInt());//先写的是id
System.out.println("age:"+buffer2.getInt());//后写的是age
//id:101,age:21
}
}
package com.cn;
import java.util.Arrays;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
public class Test3 {
public static void main(String[] args) {
//netty里面的ChannelBuffer,封装了ByteBuffer,可以自动扩容。
ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
buffer.writeInt(101);
buffer.writeDouble(80.1);
byte[] bytes = new byte[buffer.writerIndex()];//大小根据ChannelBuffer的写指针决定。
buffer.readBytes(bytes);
System.out.println(Arrays.toString(bytes));//[0, 0, 0, 101, 64, 84, 6, 102, 102, 102, 102, 102]
System.out.println("abc".getBytes());//[B@29453f44
//
ChannelBuffer wrappedBuffer = ChannelBuffers.wrappedBuffer(bytes);//传一个字节数组
System.out.println(wrappedBuffer.readInt());
System.out.println(wrappedBuffer.readDouble());
}
}