TLV解析java
来源:互联网 发布:带宽测试软件 编辑:程序博客网 时间:2024/04/20 03:34
public class TLVDecode {
private static final String TAG = "xuziangTLVDecode";
private LinkedHashMap<byte[], byte[]> mList;
public TLVDecode() {
}
public LinkedHashMap<byte[], byte[]> getDecodeTLV(byte[] tlv) {
Log.d(TAG,"getDecodeTLV tlv: " + BCDASCII.bytesToHexString(tlv));
mList = new LinkedHashMap<byte[], byte[]>();
decodeTLV(tlv);
for (byte[] item : mList.keySet()) {
Log.i(TAG, "getDecodeTLV item: "+ BCDASCII.bytesToHexString(item)+" mList.get(item):"+ BCDASCII.bytesToHexString(mList.get(item)));
}
return mList;
}
private void decodeTLV (byte[] tlv) {
if (tlv.length < 1) {
return;
}
byte[] tag;
byte[] value;
byte[] nextTlv;
int valueLen;
int lenLen;
if ((tlv[0] & 0x20) != 0x20) { // 基本数据对象
if ((tlv[0] & 0x1f) != 0X1F) { // Tag为一个字节
valueLen = (tlv[1] & 0x81) != 0x81 ? (tlv[1] & 0xFF) : (tlv[2] & 0xFF);
lenLen = (tlv[1] & 0x81) != 0x81 ? 1 : 2;
tag = new byte[1];
value = new byte[valueLen];
System.arraycopy(tlv, 0, tag, 0, 1);
System.arraycopy(tlv, 1+lenLen, value, 0, valueLen);
mList.put(tag, value);
Log.i(TAG,"mList_1 tag: "+ BCDASCII.bytesToHexString(tag)+" tag: "+ BCDASCII.bytesToHexString(value));
if (tlv.length > 1+lenLen+value.length) {
nextTlv = new byte[tlv.length-1-lenLen-valueLen];
System.arraycopy(tlv, 1+lenLen+valueLen, nextTlv, 0, tlv.length-1-lenLen-valueLen);
decodeTLV(nextTlv);
}
} else { // Tag为两个字节
valueLen = (tlv[2] & 0x81) != 0x81 ? (tlv[2] & 0xFF) : (tlv[3] & 0xFF);
lenLen = (tlv[2] & 0x81) != 0x81 ? 1 : 2;
tag = new byte[2];
value = new byte[valueLen];
System.arraycopy(tlv, 0, tag, 0, 2);
System.arraycopy(tlv, 2+lenLen, value, 0, valueLen);
mList.put(tag, value);
Log.i(TAG,"mList_2 tag: "+ BCDASCII.bytesToHexString(tag)+" tag: "+ BCDASCII.bytesToHexString(value));
if (tlv.length > 2+lenLen+value.length) {
nextTlv = new byte[tlv.length-2-lenLen-valueLen];
System.arraycopy(tlv, 2+lenLen+valueLen, nextTlv, 0, tlv.length-2-lenLen-valueLen);
decodeTLV(nextTlv);
}
}
} else
{ // 结构数据对象
if ((tlv[0] & 0x1f) != 0X1F) { // Tag为一个字节
valueLen = (tlv[2] & 0x81) != 0x81 ? (tlv[1] & 0xFF) : (tlv[2] & 0xFF);
lenLen = (tlv[2] & 0x81) != 0x81 ? 1 : 2;
tag = new byte[1];
value = new byte[valueLen];
System.arraycopy(tlv, 0, tag, 0, 1);
System.arraycopy(tlv, 1+lenLen, value, 0, valueLen);
mList.put(tag, value);
Log.i(TAG,"mList_3 tag: "+ BCDASCII.bytesToHexString(tag)+" tag: "+ BCDASCII.bytesToHexString(value));
decodeTLV(value);
if (tlv.length > 1+lenLen+valueLen) {
nextTlv = new byte[tlv.length-1-lenLen-valueLen];
System.arraycopy(tlv, 1+lenLen+valueLen, nextTlv, 0, tlv.length-1-lenLen-valueLen);
decodeTLV(nextTlv);
}
} else { // Tag为两个字节
valueLen = (tlv[2] & 0x81) != 0x81 ? (tlv[2] & 0xFF) : (tlv[3] & 0xFF);
lenLen = (tlv[2] & 0x81) != 0x81 ? 1 : 2;
tag = new byte[2];
value = new byte[valueLen];
System.arraycopy(tlv, 0, tag, 0, 2);
System.arraycopy(tlv, 2+lenLen, value, 0, valueLen);
mList.put(tag, value);
Log.i(TAG,"mList_4 tag: "+ BCDASCII.bytesToHexString(tag)+" tag: "+ BCDASCII.bytesToHexString(value));
decodeTLV(value);
if (tlv.length > 1+lenLen+valueLen) {
nextTlv = new byte[tlv.length-2-lenLen-valueLen];
System.arraycopy(tlv, 2+lenLen+valueLen, nextTlv, 0, tlv.length-2-lenLen-valueLen);
decodeTLV(nextTlv);
}
}
}
}
}
private static final String TAG = "xuziangTLVDecode";
private LinkedHashMap<byte[], byte[]> mList;
public TLVDecode() {
}
public LinkedHashMap<byte[], byte[]> getDecodeTLV(byte[] tlv) {
Log.d(TAG,"getDecodeTLV tlv: " + BCDASCII.bytesToHexString(tlv));
mList = new LinkedHashMap<byte[], byte[]>();
decodeTLV(tlv);
for (byte[] item : mList.keySet()) {
Log.i(TAG, "getDecodeTLV item: "+ BCDASCII.bytesToHexString(item)+" mList.get(item):"+ BCDASCII.bytesToHexString(mList.get(item)));
}
return mList;
}
private void decodeTLV (byte[] tlv) {
if (tlv.length < 1) {
return;
}
byte[] tag;
byte[] value;
byte[] nextTlv;
int valueLen;
int lenLen;
if ((tlv[0] & 0x20) != 0x20) { // 基本数据对象
if ((tlv[0] & 0x1f) != 0X1F) { // Tag为一个字节
valueLen = (tlv[1] & 0x81) != 0x81 ? (tlv[1] & 0xFF) : (tlv[2] & 0xFF);
lenLen = (tlv[1] & 0x81) != 0x81 ? 1 : 2;
tag = new byte[1];
value = new byte[valueLen];
System.arraycopy(tlv, 0, tag, 0, 1);
System.arraycopy(tlv, 1+lenLen, value, 0, valueLen);
mList.put(tag, value);
Log.i(TAG,"mList_1 tag: "+ BCDASCII.bytesToHexString(tag)+" tag: "+ BCDASCII.bytesToHexString(value));
if (tlv.length > 1+lenLen+value.length) {
nextTlv = new byte[tlv.length-1-lenLen-valueLen];
System.arraycopy(tlv, 1+lenLen+valueLen, nextTlv, 0, tlv.length-1-lenLen-valueLen);
decodeTLV(nextTlv);
}
} else { // Tag为两个字节
valueLen = (tlv[2] & 0x81) != 0x81 ? (tlv[2] & 0xFF) : (tlv[3] & 0xFF);
lenLen = (tlv[2] & 0x81) != 0x81 ? 1 : 2;
tag = new byte[2];
value = new byte[valueLen];
System.arraycopy(tlv, 0, tag, 0, 2);
System.arraycopy(tlv, 2+lenLen, value, 0, valueLen);
mList.put(tag, value);
Log.i(TAG,"mList_2 tag: "+ BCDASCII.bytesToHexString(tag)+" tag: "+ BCDASCII.bytesToHexString(value));
if (tlv.length > 2+lenLen+value.length) {
nextTlv = new byte[tlv.length-2-lenLen-valueLen];
System.arraycopy(tlv, 2+lenLen+valueLen, nextTlv, 0, tlv.length-2-lenLen-valueLen);
decodeTLV(nextTlv);
}
}
} else
{ // 结构数据对象
if ((tlv[0] & 0x1f) != 0X1F) { // Tag为一个字节
valueLen = (tlv[2] & 0x81) != 0x81 ? (tlv[1] & 0xFF) : (tlv[2] & 0xFF);
lenLen = (tlv[2] & 0x81) != 0x81 ? 1 : 2;
tag = new byte[1];
value = new byte[valueLen];
System.arraycopy(tlv, 0, tag, 0, 1);
System.arraycopy(tlv, 1+lenLen, value, 0, valueLen);
mList.put(tag, value);
Log.i(TAG,"mList_3 tag: "+ BCDASCII.bytesToHexString(tag)+" tag: "+ BCDASCII.bytesToHexString(value));
decodeTLV(value);
if (tlv.length > 1+lenLen+valueLen) {
nextTlv = new byte[tlv.length-1-lenLen-valueLen];
System.arraycopy(tlv, 1+lenLen+valueLen, nextTlv, 0, tlv.length-1-lenLen-valueLen);
decodeTLV(nextTlv);
}
} else { // Tag为两个字节
valueLen = (tlv[2] & 0x81) != 0x81 ? (tlv[2] & 0xFF) : (tlv[3] & 0xFF);
lenLen = (tlv[2] & 0x81) != 0x81 ? 1 : 2;
tag = new byte[2];
value = new byte[valueLen];
System.arraycopy(tlv, 0, tag, 0, 2);
System.arraycopy(tlv, 2+lenLen, value, 0, valueLen);
mList.put(tag, value);
Log.i(TAG,"mList_4 tag: "+ BCDASCII.bytesToHexString(tag)+" tag: "+ BCDASCII.bytesToHexString(value));
decodeTLV(value);
if (tlv.length > 1+lenLen+valueLen) {
nextTlv = new byte[tlv.length-2-lenLen-valueLen];
System.arraycopy(tlv, 2+lenLen+valueLen, nextTlv, 0, tlv.length-2-lenLen-valueLen);
decodeTLV(nextTlv);
}
}
}
}
}
阅读全文
0 0
- TLV 解析(Java)
- TLV解析java
- java解析TLV格式数据
- java解析TLV格式数据
- tlv解析
- tlv 格式解析
- TLV报文解析
- 网络通信协议TLV解析器
- TLV包PHP解析类
- OC封装的TLV数据格式解析库
- PBOC/EMV中TLV的构造和解析
- PBOC/EMV中TLV的构造和解析
- PBOC2.0/EMV之TLV格式解析(C++)
- PBOC/EMV中TLV的构造和解析
- java.lang.ClassNotFoundException: org.apache.taglibs.standard.tlv.JstlCoreTLV
- java.lang.ClassNotFoundException: org.apache.taglibs.standard.tlv.JstlCoreTLV
- TLV 协议
- TLV@C
- LeetCode OJ8
- 关于HTML基础的总结
- Oracle练习2-习题及答案
- redis面试总结
- 【转】Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)
- TLV解析java
- 如何简单地实现易用的ShardedJedisSentinelPool
- 如何快速接手并熟悉新项目,刚刚经历.
- [LeetCode]112. Path Sum
- Java 敏感词过滤
- java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\xB3' for column 'Content' at row 1
- 公司实习对前端ajax,jquery的认识
- 出现java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener解决方案
- hihoCoder1040:矩形判断