通信通过节流传输的。但文件内容本身就可以通过字节传输。那为什么还需要写关于字节编码与解码。为了保证文件传输可靠性和完整性,我们需要对文件切割传输。需要生成文件接收列表,用来清点接收的文件块。那么文件发送方需要将接收片段信息发送给接收方。故需要对接收片段信息进行编码与解码。
一、编码类型
int、short,long
二、实现过程
- 字节编码
对int类型转换,例如:00_AA_FF_CC(O)转换为字节组。
int为4字节大小,故byte[] 数组大小为4。
采取低低高高存储。
byte[0] = CC = 00_AA_FF_CC && 00_00_00_FF
byte[1] = FF = (00_AA_FF_CC >>> 8) && 00_00_00_FF
byte[2] = AA = (00_AA_FF_CC >>> (8 * 2)) && 00_00_00_FF
byte[3] = 00 = (00_AA_FF_CC >>> (8 * 3)) && 00_00_00_FF
public static byte[] toByte(int value) {
byte[] bytes = new byte[4];
for (int i = 0; i < 4; i++) {
bytes[i] = (byte) (value >>> (i*8) & 0xFF);
}
return bytes;
}
- 插入编码信息
public static byte[] toByte(byte[] bytes,int value,int offset) {
for (int i = 0; i < 4; i++) {
bytes[i+offset] = (byte) (value >>> (i*8) & 0xFF);
}
return bytes;
}
- 字节解码
对long类型解码
例如:字节数组{55,44,33,22,11,00,00,FF}
上式第一行为算值,第二行为字节数据。由上式可得到,每一次OR运算后,字节数据需要左移,其余位需要清零。
Java默认数据为int类型,运算过程防止溢出,需要对数据long强转。
public static long toLong(byte[] bytes) {
if (bytes.length != 8) {
throw new ErrorLengthException("need less 8 Byte");
}
long value = 0;
for (int i = 0; i < bytes.length; i++) {
value |= ((long)bytes[i] << (i * 8)) & (0xFFL << (8 * i));
}
return value;
}
- 将部分8位字节信息解码
public static long toLong(byte[] bytes,int offset) {
if (bytes.length - offset