You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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代码可以看到两处关键问题:

  1. 标签参数格式错误:你传入的unknownTags是多个标签的字节直接拼接,但SDK的方法逻辑是把整个var2数组转成一个整数,和单个标签的NTag做比较——这导致无法匹配到任何目标标签,因为拼接后的整数值和单个标签的数值完全不对应。另外,(0xBF40).toByte()本身是错误的,0xBF40是16位值,转成byte会被截断,无法正确表示BF40双字节标签。
  2. 匹配逻辑错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:40:28