用java写一个tlv的拼接工具类
时间: 2024-05-15 22:16:20 浏览: 147
以下是一个基本的TLV拼接工具类,用Java实现:
```java
import java.util.ArrayList;
import java.util.List;
public class TLVUtils {
/**
* TLV编码
* @param tag 标签
* @param value 值
* @return TLV编码后的字节数组
*/
public static byte[] encode(int tag, byte[] value) {
int len = value.length;
if (len > 127) {
// 如果长度超过127,需要使用多字节表示长度
int byteNum = 1;
int tempLen = len;
while (tempLen > 0) {
tempLen >>= 8;
byteNum++;
}
byte[] lenBytes = new byte[byteNum];
lenBytes[0] = (byte) (0x80 | byteNum - 1);
for (int i = 1; i < byteNum; i++) {
lenBytes[byteNum - i] = (byte) (len & 0xFF);
len >>= 8;
}
byte[] tlv = new byte[1 + byteNum + len];
tlv[0] = (byte) tag;
System.arraycopy(lenBytes, 0, tlv, 1, byteNum);
System.arraycopy(value, 0, tlv, 1 + byteNum, len);
return tlv;
} else {
// 如果长度在0-127之间,直接使用1字节表示长度
byte[] tlv = new byte[1 + 1 + len];
tlv[0] = (byte) tag;
tlv[1] = (byte) len;
System.arraycopy(value, 0, tlv, 1 + 1, len);
return tlv;
}
}
/**
* TLV解码
* @param data TLV编码后的字节数组
* @return List<TLV>对象
*/
public static List<TLV> decode(byte[] data) {
List<TLV> tlvList = new ArrayList<>();
int pos = 0;
while (pos < data.length) {
int tag = data[pos] & 0xFF;
pos++;
int len = data[pos] & 0xFF;
pos++;
if ((len & 0x80) != 0) {
// 如果长度字节的最高位是1,表示后面跟着的是多字节长度
len &= 0x7F;
for (int i = 0; i < len; i++) {
len <<= 8;
len |= data[pos] & 0xFF;
pos++;
}
}
byte[] value = new byte[len];
System.arraycopy(data, pos, value, 0, len);
pos += len;
TLV tlv = new TLV(tag, value);
tlvList.add(tlv);
}
return tlvList;
}
/**
* TLV对象
*/
public static class TLV {
private int tag;
private byte[] value;
public TLV(int tag, byte[] value) {
this.tag = tag;
this.value = value;
}
public int getTag() {
return tag;
}
public byte[] getValue() {
return value;
}
@Override
public String toString() {
return "TLV{" +
"tag=" + tag +
", value=" + bytesToHexString(value) +
'}';
}
}
/**
* 将字节数组转换为十六进制字符串
* @param bytes 字节数组
* @return 十六进制字符串
*/
public static String bytesToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02X", b));
}
return sb.toString();
}
}
```
使用示例:
```java
public class Test {
public static void main(String[] args) {
byte[] data = TLVUtils.encode(0x01, new byte[]{0x01, 0x02, 0x03});
System.out.println(TLVUtils.bytesToHexString(data));
List<TLVUtils.TLV> tlvList = TLVUtils.decode(data);
for (TLVUtils.TLV tlv : tlvList) {
System.out.println(tlv.toString());
}
}
}
```
输出结果:
```
0103010203
TLV{tag=1, value=010203}
```
阅读全文