首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解压缩长度为十六进制但数据为ASCII的ISO8583数据?

如何解压缩长度为十六进制但数据为ASCII的ISO8583数据?
EN

Stack Overflow用户
提问于 2019-04-23 06:34:19
回答 1查看 0关注 0票数 0

我正在尝试解压缩ISO8583消息。我用来尝试解压缩的简单代码如下:

代码语言:javascript
复制
    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。

代码语言:javascript
复制
<?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>```



EN

Stack Overflow用户

发布于 2019-04-23 16:22:05

很可能你的消息是二进制消息,你似乎需要一个基于iso87binary.xml而不是iso87ascii.xml的打包器。

但是你需要用IFB_LLHNUM来改变IFB_LLNUM,这意味着长度的二进制前缀,而不是BCD(IFB)。

代码语言:javascript
复制
    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);


    }

打包机的第一行看起来像

代码语言:javascript
复制
<?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”的这种修改,第一个字段将如下所示:

代码语言:javascript
复制
<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>

这似乎是你想要得到的

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档