如何在J8583中实现嵌套LLLLVAR?编码异常求助
在J8583中实现嵌套LLLLVAR的解决方案
要实现DE 63的嵌套LLLLVAR结构,核心思路是外层LLLLVAR的数据部分本身就是一个完整的LLLLVAR结构——只需手动构造好内层的LLLLVAR字符串,再将其作为外层LLLLVAR的数据传入即可,J8583会自动计算外层长度并添加前缀。
问题分析
你之前的两种尝试存在的问题:
- 普通设置方式:仅给原始数据添加了一层LLLLVAR长度标识,未实现嵌套结构。
- CompositeField方式:该类用于处理多子字段的复合结构,会将子字段内容转成十六进制存储,不符合字符串形式的LLLLVAR嵌套需求。
正确实现代码
val msgFactory = MessageFactory<IsoMessage>() val isoRequest: IsoMessage = msgFactory.newMessage(0x800) // 构造内层完整LLLLVAR:4位长度标识 + 对应数据 val innerLLLLVAR = "0018" + "180000141181400024" // 将内层整体作为DE 63的值,J8583自动添加外层LLLLVAR长度标识 isoRequest.setValue(63, innerLLLLVAR, IsoType.LLLLVAR, 999) log(isoRequest.writeData().bytesToHex())
执行后会生成预期结果:00200018313830303030313431313831343030303234,其中:
0020是外层LLLLVAR的长度标识(内层字符串总长度为20)0018是内层LLLLVAR的长度标识- 后续部分是
180000141181400024的十六进制编码
通用扩展(支持多表ID场景)
如果DE 63需要包含多个表ID,可封装工具方法统一生成内层LLLLVAR,再拼接所有内层内容作为外层数据:
// 生成单个表ID对应的内层LLLLVAR字符串 fun buildTableLLLLVAR(tableData: String): String { // 格式化4位长度标识 val lengthStr = String.format("%04d", tableData.length) return lengthStr + tableData } // 使用示例:假设有两个表ID的数据 val table1Data = "180000141181400024" val table2Data = "01xxxxxxxxx..." val combinedInner = buildTableLLLLVAR(table1Data) + buildTableLLLLVAR(table2Data) isoRequest.setValue(63, combinedInner, IsoType.LLLLVAR, 999)
内容的提问来源于stack exchange,提问作者Bitwise DEVS
相关产品推荐
相关产品推荐

