我正在尝试解压缩ISO8583消息。我用来尝试解压缩的简单代码如下:
String message = "0100767C64C1A8E0B8231047611400000001530100000000000105000000002364330418190929522517452144201409220418221260110250002100040465010B092500026401204761140000000153D22122011320401538313731323035353838323541544D3131303120424444462020202020202020202020445552414E445C50415249535C373530303720202020202020202020202020202020202020204652097804849B22C88200C53DCD0A0160320101000100110112010002010001020116020001700205020250203036376531303961306333643464353539366235376236346562643536326231C6F66DB200000000";
byte[] b = message.getBytes(ISOUtil.CHARSET);
GenericPackager packager = new
GenericPackager("sample_packager.xml");
ISOMsg isoMsg = new ISOMsg();
isoMsg.setPackager(packager);
isoMsg.unpack(b);
在我应该解压缩的消息中,LLVAR类型类的长度是十六进制,但数据是ASCII。例如,在这种情况下,字段2是104761140000000153.长度10是十六进制,实际上是接下来的16个数据。我怎么去解释这个呢?我可以将哪个jpos类用于PAN字段,这样我可以将数据保存为ASCII但仍然以十六进制而不是十进制为长度?
注意:
很容易,目前的位是2,3,4,6,7,10,11,12,13,14,18,19,22,25,26,32,33,35,37,41,42,43 ,49,51,52,53,59,63,64。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE isopackager SYSTEM "genericpackager.dtd">
<!-- BDDF field descriptions for GenericPackager -->
<isopackager>
<isofield
id="0"
length="4"
name="MESSAGE TYPE INDICATOR"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="1"
length="16"
name="BITMAP"
class="org.jpos.iso.IFA_BITMAP"/>
<isofield
id="2"
length="19"
name="PRIMARY ACCOUNT NUMBER"
pad="false"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="3"
length="6"
name="PROCESSING CODE"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="4"
length="12"
name="AMOUNT, TRANSACTION"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="6"
length="12"
name="AMOUNT, CARDHOLDER BILLING"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="7"
length="10"
name="DATE AND TIME TRANSMISSION"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="10"
length="8"
name="CONVERSION RATE, CARDHOLDER BILLING"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="11"
length="6"
name="SYSTEM TRACE AUDIT NUMBER"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="12"
length="6"
name="TIME, LOCAL TRANSACTION"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="13"
length="4"
name="DATE, LOCAL TRANSACTION"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="14"
length="4"
name="DATE, EXPIRATION"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="15"
length="4"
name="SETTLEMENT DATE"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="18"
length="4"
name="MERCHANTS TYPE"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="19"
length="3"
name="ACQUIRING INSTITUTION COUNTRY CODE"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="22"
length="3"
name="POINT OF SERVICE ENTRY MODE"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="23"
length="3"
name="CARD SEQUENCE NUMBER"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="25"
length="2"
name="POINT OF SERVICE CONDITION CODE"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="26"
length="2"
name="POINT OF SERVICE PESONNEL IDENTIFICATION NUMBER CAPTURE CODE"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="27"
length="1"
name="AUTHORIZATION IDENTIFICATION RESPONSE LENGTH"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="28"
length="9"
name="TRANSACTION FEE AMOUNT"
pad="true"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="32"
length="11"
name="ACQUIRING INSTITUTION IDENTIFICATION CODE"
pad="false"
class="org.jpos.iso.IFA_LLNUM"/>
<isofield
id="33"
length="11"
name="FORWARDING INSTITUTION IDENTIFICATION CODE"
pad="false"
class="org.jpos.iso.IFA_LLNUM"/>
<isofield
id="35"
length="37"
pad="false"
name="TRACK 2 DATA"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="37"
length="12"
pad="true"
name="RETRIEVAL REFERENCE NUMBER"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="38"
length="6"
pad="true"
name="AUTHORIZATION IDENTIFICATION RESPONSE"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="39"
length="2"
pad="true"
name="RESPONSE CODE"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="41"
length="8"
pad="true"
name="CARD ACCEPTOR TERMINAL IDENTIFICACION"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="42"
length="15"
pad="true"
name="CARD ACCEPTOR IDENTIFICATION CODE"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="43"
length="40"
pad="true"
name="CARD ACCEPTOR NAME/LOCATION"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="44"
length="99"
pad="false"
name="ADITIONAL RESPONSE DATA"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="45"
length="76"
pad="false"
name="TRACK 1 DATA"
class="org.jpos.iso.IFA_LLCHAR"/>
<isofield
id="47"
length="255"
pad="false"
name="ADITIONAL DATA - NATIONAL"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="48"
length="255"
pad="false"
name="ADITIONAL DATA - PRIVATE"
class="org.jpos.iso.IFB_LLLCHAR"/>
<isofield
id="49"
length="3"
name="CURRENCY CODE, TRANSACTION"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="51"
length="3"
pad="true"
name="CURRENCY CODE, CARDHOLDER BILLING"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="52"
length="8"
pad="true"
name="PIN DATA"
class="org.jpos.iso.IFA_BINARY"/>
<isofield
id="53"
length="48"
pad="false"
name="SECURITY RELATED CONTROL INFORMATION"
class="org.jpos.iso.IFA_LLBINARY"/>
<isofield
id="54"
length="120"
pad="false"
name="ADDITIONAL AMOUNTS"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="55"
length="255"
pad="false"
name="INTEGRATED CIRCUIT CARD RELATED DATA"
class="org.jpos.iso.IFA_LLLBINARY"/>
<isofield
id="58"
length="255"
pad="false"
name="REPLYING MACHINE IDENTIFICATION CODE"
class="org.jpos.iso.IFA_LLLCHAR"/>
<isofield
id="59"
length="255"
pad="false"
name="NATIONAL DATA"
class="org.jpos.iso.IFA_LLLBINARY"/>
<isofield
id="64"
length="8"
pad="true"
name="MESSAGE AUTHENTICATION CODE FIELD"
class="org.jpos.iso.IFA_BINARY"/>
<isofield
id="90"
length="42"
name="ORIGINAL DATA ELEMENTS"
pad="true"
class="org.jpos.iso.IFA_NUMERIC"/>
<isofield
id="95"
length="42"
pad="true"
name="REPLACEMENT AMOUNTS"
class="org.jpos.iso.IF_CHAR"/>
<isofield
id="100"
length="11"
name="RECEIVING INSTITUTION IDENT CODE"
pad="false"
class="org.jpos.iso.IFA_LLNUM"/>
<isofield
id="114"
length="255"
pad="false"
name="RESERVED NATIONAL USE"
class="org.jpos.iso.IFA_LLLCHAR"/>
</isopackager>```
发布于 2019-04-23 16:22:05
很可能你的消息是二进制消息,你似乎需要一个基于iso87binary.xml而不是iso87ascii.xml的打包器。
但是你需要用IFB_LLHNUM来改变IFB_LLNUM,这意味着长度的二进制前缀,而不是BCD(IFB)。
public static void main(String[] args) throws ISOException {
String message = "0100767C64C1A8E0B8231047611400000001530100000000000105000000002364330418190929522517452144201409220418221260110250002100040465010B092500026401204761140000000153D22122011320401538313731323035353838323541544D3131303120424444462020202020202020202020445552414E445C50415249535C373530303720202020202020202020202020202020202020204652097804849B22C88200C53DCD0A0160320101000100110112010002010001020116020001700205020250203036376531303961306333643464353539366235376236346562643536326231C6F66DB200000000";
byte[] b = ISOUtil.hex2byte(message);
GenericPackager packager;
packager = new
GenericPackager("sample_packager.xml");
Logger logger = new Logger();
logger.addListener(new SimpleLogListener());
packager.setLogger(logger, "packager");
ISOMsg isoMsg =
new ISOMsg();
isoMsg.setPackager(packager);
isoMsg.unpack(b);
}
打包机的第一行看起来像
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE isopackager PUBLIC
"-//jPOS/jPOS Generic Packager DTD 1.0//EN"
"http://jpos.org/dtd/generic-packager-1.0.dtd">
<!-- ISO 8583:1987 (BINARY) field descriptions for GenericPackager -->
<isopackager>
<isofield
id="0"
length="4"
name="MESSAGE TYPE INDICATOR"
pad="true"
class="org.jpos.iso.IFB_NUMERIC"/>
<isofield
id="1"
length="16"
name="BIT MAP"
class="org.jpos.iso.IFB_BITMAP"/>
<isofield
id="2"
length="19"
name="PAN - PRIMARY ACCOUNT NUMBER"
pad="false"
class="org.jpos.iso.IFB_LLHNUM"/>
通过对“sample_packager.xml”的这种修改,第一个字段将如下所示:
<log realm="packager" at="2019-04-22T14:09:21.658" lifespan="14ms">
<unpack>
0100767C64C1A8E0B8231047611400000001530100000000000105000000002364330418190929522517452144201409220418221260110250002100040465010B092500026401204761140000000153D22122011320401538313731323035353838323541544D3131303120424444462020202020202020202020445552414E445C50415249535C373530303720202020202020202020202020202020202020204652097804849B22C88200C53DCD0A0160320101000100110112010002010001020116020001700205020250203036376531303961306333643464353539366235376236346562643536326231C6F66DB200000000
<bitmap>{2, 3, 4, 6, 7, 10, 11, 12, 13, 14, 18, 19, 22, 25, 26, 32, 33, 35, 37, 41, 42, 43, 49, 51, 52, 53, 59, 63, 64}</bitmap>
<unpack fld="2" packager="org.jpos.iso.IFB_LLHNUM">
<value>4761140000000153</value>
</unpack>
这似乎是你想要得到的
https://stackoverflow.com/questions/-100006660
复制相似问题