使用terminalSdk-2.0.3.jar的TLVUtility移除未知标签失败求助
使用TLVUtility移除指定TLV标签失败
问题详情
尝试通过terminalSdk-2.0.3.jar中的TLVUtility类,从TLV格式的ByteArray中移除C3、BF40、C2等未知标签,但执行后目标标签并未被移除。
原始TLV数据
ppseResponse = ByteUtility.hexStringToByteArray("6F54840E325041592E5359532E4444463031C30F4920414D2054484520424553542033BF4003C20101A52BBF0C28610C4F07A0000000041010870101610C4F07A0000000043060870103610A4F05B0123456788701099000")
尝试的移除代码
"BEFORE << ${ByteUtility.byteArrayToHexString(ppseResponse)}".toLog(activity, TAG) //打印日志 val unknownTags = byteArrayOf((0x00C3).toByte(),(0xBF40).toByte(), (0x00C2).toByte()) var removed = TLVUtility.removeTag(ppseResponse, ContentType.TLV,unknownTags) "AFTER << ${ByteUtility.byteArrayToHexString(removed)}".toLog(activity, TAG) //打印日志
terminalSdk-2.0.3.jar中removeTag函数实现
public static byte[] removeTag(byte[] var0, ContentType var1, byte[] var2) { int var10000; Throwable var10001; String var28; label698: { var10000 = 2 % 2; if (var0 != null) { label691: { var10000 = g + 85; f = var10000 % 128; if (var10000 % 2 == 0) { byte[] var26 = var2; byte var27; label676: { label675: { try { null.hashCode(); if (var26 == null) { break label675; } } catch (Throwable var25) { throw var25; } var27 = 42; break label676; } var27 = 74; } switch(var27) { case 42: break; case 74: default: break label691; } } else if (var2 == null) { break label691; } var10000 = f + 55; g = var10000 % 128; switch(var10000 % 2 != 0 ? 0 : 1) { case 0: default: if (var2.length >= 1) { break label698; } break; case 1: if (var2.length >= 1) { break label698; } } } } var28 = e(31, '卆', 490).intern(); try { ((Class)q.b(38, 8595, '\ue0f7')).getMethod("e", String.class).invoke((Object)null, var28); } catch (Throwable var22) { var10001 = var22.getCause(); if (var10001 != null) { throw var10001; } throw var22; } throw new LibraryUncheckedException(ExceptionCode.X6F44); } label700: { if (var1 == ContentType.T) { var10000 = g + 15; f = var10000 % 128; if (var10000 % 2 == 0) { if (var0.length < 0) { break label700; } } else if (var0.length < 1) { break label700; } } switch(var1 != ContentType.TLV ? 81 : 64) { case 81: if (var1 != ContentType.TDO) { break; } case 64: default: if (var0.length < 3) { var28 = e(47, '\u0000', 560).intern(); try { ((Class)q.b(38, 8595, '\ue0f7')).getMethod("e", String.class).invoke((Object)null, var28); } catch (Throwable var23) { var10001 = var23.getCause(); if (var10001 != null) { throw var10001; } throw var23; } throw new LibraryUncheckedException(ExceptionCode.X6F43); } } ArrayList var3 = conditionalTlvParsing(var0, var1, e(1, '\u0000', 140).intern(), true); Iterator var4 = var3.iterator(); while(var4.hasNext()) { BerTlv var5 = (BerTlv)var4.next(); switch(var5.getTagObject().getNTag() == ByteUtility.byteArrayToInt(var2) ? 39 : 84) { case 39: default: var4.remove(); case 84: } } return formByteArrayFromTlvList(var3, var1); } var28 = e(39, '\u0000', 521).intern(); try { ((Class)q.b(38, 8595, '\ue0f7')).getMethod("e", String.class).invoke((Object)null, var28); } catch (Throwable var24) { var10001 = var24.getCause(); if (var10001 != null) { throw var10001; } throw var24; } throw new LibraryUncheckedException(ExceptionCode.X6F43); }
问题原因分析
从反编译的removeTag代码可以看到两处关键问题:
- 标签参数格式错误:你传入的
unknownTags是多个标签的字节直接拼接,但SDK的方法逻辑是把整个var2数组转成一个整数,和单个标签的NTag做比较——这导致无法匹配到任何目标标签,因为拼接后的整数值和单个标签的数值完全不对应。另外,(0xBF40).toByte()本身是错误的,0xBF40是16位值,转成byte会被截断,无法正确表示BF40双字节标签。 - 匹配逻辑错误:switch分支中,无论标签是否匹配,都会执行
var4.remove(),逻辑完全混乱,进一步导致功能失效。
解决方法
方法1:逐个调用removeTag处理单个标签
如果SDK的removeTag仅支持单个标签移除,循环遍历每个目标标签单独调用方法:
var removed = ppseResponse // 正确定义每个标签:单字节标签用单元素数组,双字节标签用双元素数组 val unknownTagsList = listOf( byteArrayOf(0xC3.toByte()), byteArrayOf(0xBF.toByte(), 0x40.toByte()), byteArrayOf(0xC2.toByte()) ) unknownTagsList.forEach { tag -> removed = TLVUtility.removeTag(removed, ContentType.TLV, tag) }
方法2:自行实现多标签移除逻辑
如果SDK没有批量移除能力,可以自行解析TLV结构,过滤掉目标标签后重新组装字节数组,避免依赖SDK的错误逻辑。
内容的提问来源于stack exchange,提问作者SHIDHIN TS
相关产品推荐
相关产品推荐

