maven管理项目 + junit单元测试

This commit is contained in:
ghy committed 2021-03-02 21:35:29 +08:00
1 parent b07bf8a9f9
commit 5938be8893
9 files changed
+47 -1

No files matched your search

+192
View File
@@ -0,0 +1,192 @@
package encoding;
import util.ByteHelper;
import java.util.LinkedList;
import java.util.List;
/*
* @Author: Wang Feng
* @Description:
* @Version: 1.0.0
* @Date: 14:19 2021/3/2
* @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
*/
// TLV 组件容器
class ElementContainer{
private List<Block> ElementContainer;
public ElementContainer(){
ElementContainer= new LinkedList<>();
}
public int length(){
return ElementContainer.size();
}
}
public class Block {
private VlInt tlvType; // TLV-TYPE
private VlInt length; // TLV-LENGTH
private byte[] value; // TLV-VALUE
private ElementContainer elements; // TLV-sub-elements
private byte[] raw; // TLV编码后的字节数组
/**
* 从一个包含TLV的字节数组中构造一个 Block 对象
* @param buffer
* @param verifyLength 是否要验证TLV的长度是否匹配,如果true,
* 则会对比解析到的 TLV-LENGTH 与 TLV-VALUE的实际长度是否匹配
* @return
*/
public Block createBlockByBuffer(byte[] buffer,boolean verifyLength){
if(buffer.length==0){
return null;
}
// 读取type
VlInt tlvType=TLV.readType(buffer,new VlInt(0));
if(tlvType==null){
return null;
}
// 读取length
VlInt tlvLength=TLV.readVarNumber(buffer,new VlInt(tlvType.SizeOfVarNumber()));
if(tlvLength==null){
return null;
}
return createBlockByTypeLengthBuffer(tlvType,tlvLength,
ByteHelper.getLenBytes(buffer,new VlInt(tlvType.SizeOfVarNumber()+tlvLength.SizeOfVarNumber()),
buffer.length-(tlvType.SizeOfVarNumber()+tlvLength.SizeOfVarNumber())),verifyLength);
}
/**
* 传入 T、L、V 构造一个 TLV Block
* @param tlvType
* @param tlvLength
* @param buffer
* @param verifyLength
* @return
*/
public Block createBlockByTypeLengthBuffer(VlInt tlvType,VlInt tlvLength,byte[] buffer,boolean verifyLength){
return new Block(tlvType,tlvLength,buffer,verifyLength);
}
/**
* 构造函数
* @param tlvType
* @param tlvLength
* @param buffer
* @param verifyLength
*/
public Block(VlInt tlvType,VlInt tlvLength,byte[] buffer,boolean verifyLength){
this.tlvType=tlvType;
this.length=tlvLength;
// 检查长度是否正确
if(verifyLength && (!this.length.isEqual(buffer.length))){
//todo: 抛出异常
}
// todo;设置 Raw
// todo 设置Value
}
public VlInt getTlvType() {
return tlvType;
}
public void setTlvType(VlInt tlvType) {
this.tlvType = tlvType;
}
public VlInt getLength() {
return length;
}
public void setLength(VlInt length) {
this.length = length;
}
public byte[] getValue() {
return value;
}
public void setValue(byte[] value) {
this.value = value;
}
public byte[] getRaw() {
return raw;
}
/**
* 整个TLV编码后的大小,包含T和L
* @return
*/
public SizeT Size(){
if(!this.isValid()){
return null;
}
return new SizeT(this.tlvType.SizeOfVarNumber()+this.length.SizeOfVarNumber()+this.value.length);
}
/**
* 判断当前的 Block 对象是否含有 value
* @return
*/
public boolean hasValue(){
return this.value.length!=0;
}
/**
* 判断当前的 Block 对象是否含有 raw数组
* @return
*/
public boolean hasRaw(){
return this.raw.length!=0;
}
// ************** Sub-Elements **************
/**
* 判断当前 TLV Block 是否包含子 TLV
* 1. 每次通过 CreateBlockBy* 系列工厂方法构造出Block之后,需要手动调用 ParseSubElements 方法,
* 才会去解析一级子TLV
* @return
*/
public boolean hasSubElement(){
return this.elements.length()!=0;
}
/**
* 获取所有的一级子TLV Block
* * 1. 每次通过 CreateBlockBy* 系列工厂方法构造出Block之后,需要手动调用 ParseSubElements 方法,
* * 才会去解析一级子TLV
* @return
*/
public ElementContainer getSubElements(){
return this.elements;
}
/**
* 从 value 字节数组中解析出所有的一级子 TLV Block
* 1. 这要求这个TLV确实存在嵌套的子TLV,或者为空;
* 2. 如果TLV的value不为空,且不存在嵌套的子TLV,则会抛出错误
* @return
*/
// public boolean parseSubElements(){
//
// }
/**
* 判断是否有效
* @return
*/
public boolean isValid(){
return true;
}
}