1、解析类
/**
* ISO8583数据解析器<br>
* ISO8583数据结构:2字节消息类型(BCD码) + 域1至域64/128<br>
* @author yanhang0610
*/
public class Iso8583Package {
// 报文结构
private byte[] messageTypeBytes = new byte[2]; // BCD编码的消息类型
// 位元图,如"01001000...",位于第1域
private byte[] bitMapBytes = new byte[8];
// 默认变长字段长度存储格式为压缩的BCD码
private Iso8583Package.VarLengthFormat varLengthFormat = Iso8583Package.VarLengthFormat.BCD;
// 存放各个域的配置信息(<0, Iso8583Field>。。。)
private Map<Integer, Iso8583Package.Iso8583Field> iso8583FieldConfigs = new HashMap<Integer, Iso8583Package.Iso8583Field>();
// 存放各个域的值(<0, byte[]>、<1, byte[]>。。。)
private Map<Integer, byte[]> fieldsData = new HashMap<Integer, byte[]>();
/**
* 构造函数,默认无扩展位图,变长字段长度存储格式为压缩的BCD码
* @param iso8583configFilePathName
*/
public Iso8583Package(String iso8583configFilePathName) {
this(iso8583configFilePathName, false, Iso8583Package.VarLengthFormat.BCD);
}
/**
* 构造函数,默认无扩展位图,自定义变长字段长度存储格式
* @param iso8583configFilePathName
* @param varLengthFormat 变长字段长度存储格式
*/
public Iso8583Package(String iso8583configFilePathName, Iso8583Package.VarLengthFormat varLengthFormat) {
this(iso8583configFilePathName, false, varLengthFormat);
}
/**
* 构造函数
* @param iso8583configFilePathName
* @param isExtendBitMap 是否扩展位图
* @param varLengthFormat 变长字段长度存储格式
*/
public Iso8583Package(String iso8583configFilePathName, boolean isExtendBitMap, Iso8583Package.VarLengthFormat varLengthFormat) {
// 设置扩展位元图
if (isExtendBitMap) {
String bitMapStr = "1" + ByteUtils.getBinaryString(new byte[16]).substring(1);
this.bitMapBytes = ByteUtils.binaryStringToBytes(bitMapStr);
}
// 加载配置文件
this.iso8583FieldConfigs = this.loadConfigFile(iso8583configFilePathName);
if (varLengthFormat != null) {
this.varLengthFormat = varLengthFormat;
}
}
/**
* 加载iso8583配置文件
*/
private Map<Integer, Iso8583Package.Iso8583Field> loadConfigFile(String iso8583configFilePathName) {
Map<Integer, Iso8583Package.Iso8583Field> map = new HashMap<Integer, Iso8583Package.Iso8583Field>();
XmlBean xml = new XmlBean(iso8583configFilePathName);
List<Element> configs = xml.getChildNodes("/iso8583Fields");
for (Element element : configs) {
List<Element> subConfigs = element.elements();
String subTagName = "";
String subTagValue = "";
int fieldNum = 0;
Iso8583Package.Iso8583Field iso8583Field = new Iso8583Package.Iso8583Field();
for (Element subElement : subConfigs) {
subTagName = subElement.getName();
subTagValue = subElement.getTextTrim();
try {
if ("fieldNum".equalsIgnoreCase(subTagName)) {
fieldNum = Integer.parseInt(subTagValue);
iso8583Field.setFieldNum(fieldNum);
} else if ("fieldName".equalsIgnoreCase(subTagName)) {
iso8583Field.setFieldName(subTagValue);
} else if ("dataStorageFormat".equalsIgnoreCase(subTagName)) {
if ("ASCII".equalsIgnoreCase(subTagValue)) {
iso8583Field.setDataStorageFormat(Iso8583Package.DataStorageFormat.ASCII);
} else if ("BINARY".equalsIgnoreCase(subTagValue)) {
iso8583Field.setDataStorageFormat(Iso8583Package.DataStorageFormat.BINARY);
} else if ("BCD".equalsIgnoreCase(subTagValue)) {
iso8583Field.setDataStorageFormat(Iso8583Package.DataStorageFormat.BCD);
} else {
throw new RuntimeException("配置文件出错,第[" + fieldNum + "]域dataStorageFormat配置错误[\"" + subTagValue + "\"]!");
}
} else if ("length".equalsIgnoreCase(subTagName)) {
iso8583Field.setLength(Integer.parseInt(subTagValue));
} else if ("fieldFormat".equalsIgnoreCase(subTagName)) {
if ("None".equalsIgnoreCase(subTagValue)) {
iso8583Field.setFieldFormat(Iso8583Package.FieldFormat.NONE);
} else if ("LVAR".equalsIgnoreCase(subTagValue)) {
iso8583Field.setFieldFormat(Iso8583Package.FieldFormat.LVAR);
} else if ("LLVAR".equalsIgnoreCase(subTagValue)) {
iso8583Field.setFieldFormat(Iso8583Package.FieldFormat.LLVAR);
} else if ("LLLVAR".equalsIgnoreCase(subTagValue)) {
iso8583Field.setFieldFormat(Iso8583Package.FieldFormat.LLLVAR);
} else if ("LLLLVAR".equalsIgnoreCase(subTagValue)) {
iso8583Field.setFieldFormat(Iso8583Package.FieldFormat.LLLLVAR);
} else {
throw new RuntimeException("配置文件出错,第[" + fieldNum + "]域fieldFormat配置错误[\"" + subTagValue + "\"]!");
}
} else if ("align".equalsIgnoreCase(subTagName)) {
if ("Left".equalsIgnoreCase(subTagValue)) {
iso8583Field.setAlign(Iso8583Package.Align.LEFT);
} else if ("Right".equalsIgnoreCase(subTagValue)) {
iso8583Field.setAlign(Iso8583Package.Align.RIGHT);
} else {
throw new RuntimeException("配置文件出错,第[" + fieldNum + "]域align配置错误[\"" + subTagValue + "\"]!");
}
} else if ("padChar".equalsIgnoreCase(subTagName)) {
if ("Null".equalsIgnoreCase(subTagValue)) {
iso8583Field.setPadChar(Iso8583Package.PadChar.NULL);
} else if ("Space".equalsIgnoreCase(subTagValue)) {
iso8583Field.setPadChar(Iso8583Package.PadChar.SPACE);
} else {
throw new RuntimeException("配置文件出错,第[" + fieldNum + "]域padChar配置错误[\"" + subTagValue + "\"]!");
}
} else {
throw new RuntimeException("配置文件出错,找不到有效的配置项[FieldNum: " + fieldNum + "][TagName: \"" + subTagName + "\", TagValue: \"" + subTagValue + "\"]!");
}
} catch (Exception e) {
if (e instanceof NumberFormatException) {
throw new RuntimeException("配置文件出错,数字值非法[FieldNum: " + fieldNum + "][TagName: \"" + subTagName + "\", TagValue: \"" + subTagValue + "\"]!");
} else {
throw new RuntimeException(e.getMessage());
}
}
}
if (fieldNum > 0) {
map.put(fieldNum, iso8583Field);
// System.out.println(iso8583Field.toString());
}
}
return map;
}
/**
* 解析各个域的值
* @param iso8583FieldsBytes 域1~128的数据
* @return
*/
public Map<Integer, byte[]> parseFields(byte[] iso8583FieldsBytes) {
Map<Integer, byte[]> fieldsData = new HashMap<Integer, byte[]>();
try {
byte[] bitMapBytes = this.parseBitMap(iso8583FieldsBytes);
fieldsData.put(new Integer(1), bitMapBytes);
this.bitMapBytes = bitMapBytes;
int idx = 0; // 指针
idx += bitMapBytes.length;
String bitMapStr = ByteUtils.getBinaryString(bitMapBytes);
int bitMapStrLength = bitMapStr.length();
Iso8583Package.FieldFormat fieldFormat = Iso8583Package.FieldFormat.NONE;
for (int i = 1; i < bitMapStrLength; i++) {
if (bitMapStr.charAt(i) == '1') {
Integer fieldNum = i + 1;
Iso8583Package.Iso8583Field fieldConfig = iso8583FieldConfigs.get(fieldNum);
int fieldLength = 0; // 域占用的字节数(长度字节和内容字节总的字节数)
int length = fieldConfig.getLength(); // 域内容不同存储格式下该格式对应的最大存储个数
// 计算实际个数(比配LLLL表示的长度和配置文件length值,LLLL长度不能大于length)
fieldFormat = fieldConfig.getFieldFormat();
if (fieldFormat == Iso8583Package.FieldFormat.NONE) {
// 无处理, length即为实际个数
} else {
// 长度字节数(LL..L 占用的字节数)
int lengthBytesLength = this.getVarLengthBytesLength(fieldFormat);
long varLength = 0;
if (this.varLengthFormat == Iso8583Package.VarLengthFormat.BCD) {
varLength = ByteUtils.readBCD(iso8583FieldsBytes, idx, lengthBytesLength);
} else if (this.varLengthFormat == Iso8583Package.VarLengthFormat.ASCII) {
varLength = ByteUtils.readLong(iso8583FieldsBytes, idx, lengthBytesLength);
} else if (this.varLengthFormat == Iso8583Package.VarLengthFormat.NUMBER_STRING) {
varLength = Long.parseLong(ByteUtils.readString(iso8583FieldsBytes, idx, lengthBytesLength));
}
if (varLength <= length) {
length = (int) varLength; // 变长长度不能大于length
} else {
throw new RuntimeException("[FieldNum: " + fieldNum + "]变长长度[" + varLength + "]不能大于配置文件里的length值[" + length + "]!");
}
fieldLength += lengthBytesLength;
}
// 计算内容部分占用的字节数
int fieldContentLength = 0; // 域内容实际占用的字节数
Iso8583Package.DataStorageFormat dataStoreFormat = fieldConfig.getDataStorageFormat();
if (dataStoreFormat == Iso8583Package.DataStorageFormat.ASCII) {
fieldContentLength = length;
} else if (dataStoreFormat == Iso8583Package.DataStorageFormat.BCD) {
fieldContentLength = length % 2 == 0 ? length / 2 : (length / 2 + 1);
} else if (dataStoreFormat == Iso8583Package.DataStorageFormat.BINARY) {
fieldContentLength = length;
} else {
return null;
}
fieldLength += fieldContentLength;
byte[] fieldBytes = ByteUtils.getSubBytesByIndex(iso8583FieldsBytes, idx, idx + fieldLength - 1);
fieldsData.put(new Integer(fieldNum), fieldBytes);
idx += fieldLength;
}
}
this.fieldsData = fieldsData;
} catch (Exception e) {
throw new RuntimeException("参数值[iso8583FieldsBytes]有误!" + (e.getMessage() == null ? "" : e.getMessage()));
}
return fieldsData;
}
/******* 位图 *************************************************************************/
/**
* 从iso8583FieldsBytes解析位图
*/
private byte[] parseBitMap(byte[] iso8583FieldsBytes) {
byte b0 = iso8583FieldsBytes[0];
String b0Str = ByteUtils.getBinaryString(new byte[] { b0 });
if (b0Str.startsWith("1")) {
return ByteUtils.getSubBytesByIndex(iso8583FieldsBytes, 0, 15);
} else {
return ByteUtils.getSubBytesByIndex(iso8583FieldsBytes, 0, 7);
}
}
/**
* 位图置位
* @param fieldNum 域,2-128,第1域为位图,不做处理
* @param value 值,0或1
*/
private void setBitMap(int fieldNum, int value) {
if (fieldNum < 2 || fieldNum > bitMapBytes.length * 8 || (value != 0 && value != 1)) {
return;
}
String bitMapStr = ByteUtils.getBinaryString(bitMapBytes);
bitMapStr = bitMapStr.substring(0, fieldNum - 1) + value + (fieldNum == bitMapStr.length() ? "" : bitMapStr.substring(fieldNum));
this.bitMapBytes = ByteUtils.binaryStringToBytes(bitMapStr);
this.fieldsData.put(new Integer(1), this.bitMapBytes);
}
/******* 赋值 *************************************************************************/
/**
* 根据配置文件里的域配置进行设值(默认UTF-8编码)
* @param fieldNum
* @param value 当域数据存储格式为ASCII时,value可为任意字符串;当存储格式为BCD时,value应为整数形式的字符串;当存储格式为BINARY时,value应为由0-9A-F组成的十六进制形式的字符串。
* @return
*/
public boolean setField(int fieldNum, String value) {
return setField(fieldNum, value, "UTF-8");
}
/**
* 根据配置文件里的域配置进行设值
* @param fieldNum
* @param value 当域数据存储格式为ASCII时,value可为任意字符串;当存储格式为BCD时,value应为整数形式的字符串;当存储格式为BINARY时,value应为由0-9A-F组成的十六进制形式的字符串。
* @param charsetName
* @return
*/
public boolean setField(int fieldNum, String value, String charsetName) {
try {
Integer fieldNumInteger = new Integer(fieldNum);
Iso8583Package.Iso8583Field fieldConfig = iso8583FieldConfigs.get(fieldNumInteger); // 域配置
Iso8583Package.DataStorageFormat dataStoreFormat = fieldConfig.getDataStorageFormat();
byte[] bytes = null;
if (dataStoreFormat == Iso8583Package.DataStorageFormat.ASCII) {
bytes = value.getBytes(charsetName);
} else if (dataStoreFormat == Iso8583Package.DataStorageFormat.BCD) {
boolean isFullBCD = true;
if (value.length() % 2 != 0) {
isFullBCD = false;
if (fieldConfig.align == Iso8583Package.Align.LEFT) {
value = value + "0";
} else {
value = "0" + value;
}
}
bytes = ByteUtils.hexStringToBytes(value);
return setField(fieldNum, bytes, isFullBCD);
} else if (dataStoreFormat == Iso8583Package.DataStorageFormat.BINARY) {
bytes = ByteUtils.hexStringToBytes(value);
}
return setField(fieldNum, bytes);
} catch (Exception e) {
String msg = "域赋值出错[FieldNum: " + fieldNum + ", Value(String): " + value + "]!";
throw new RuntimeException(e.getMessage() == null ? msg : (e.getMessage().startsWith("域赋值出错") ? e.getMessage() : msg + e.getMessage()));
}
}
/**
* 根据配置文件里的域配置进行设值
* @param fieldNum
* @param value
* @return
*/
public boolean setField(int fieldNum, int value) {
try {
Integer fieldNumInteger = new Integer(fieldNum);
Iso8583Package.Iso8583Field fieldConfig = iso8583FieldConfigs.get(fieldNumInteger); // 域配置
Iso8583Package.DataStorageFormat dataStoreFormat = fieldConfig.getDataStorageFormat();
byte[] bytes = null;
if (dataStoreFormat == Iso8583Package.DataStorageFormat.ASCII) {
bytes = ByteUtils.bytesTrimLeft(ByteUtils.intToBytes(value), (byte) 0x00);
} else if (dataStoreFormat == Iso8583Package.DataStorageFormat.BCD) {
boolean isFullBCD = true;
String valueStr = value + "";
if (valueStr.length() % 2 != 0) {
isFullBCD = false;
if (fieldConfig.align == Iso8583Package.Align.LEFT) {
valueStr = valueStr + "0";
} else {
valueStr = "0" + valueStr;
}
}
bytes = ByteUtils.hexStringToBytes(valueStr);
return setField(fieldNum, bytes, isFullBCD);
} else if (dataStoreFormat == Iso8583Package.DataStorageFormat.BINARY) {
bytes = ByteUtils.bytesTrimLeft(ByteUtils.intToBytes(value), (byte) 0x00);
}
return setField(fieldNum, bytes);
} catch (Exception e) {
String msg = "域赋值出错[FieldNum: " + fieldNum + ", Value(int): " + value + "]!";
throw new RuntimeException(e.getMessage() == null ? msg : (e.getMessage().startsWith("域赋值出错") ? e.getMessage() : msg + e.getMessage()));
}
}
/**
* 根据配置文件里的域配置进行设值
* @param fieldNum
* @param value 若字段为BCD格式,则BCD个数为value.length * 2
* @return
*/
public boolean setField(int fieldNum, byte[] value) {
return setField(fieldNum, value, true);
}
/**
* 根据配置文件里的域配置进行设值
* @param fieldNum
* @param value 若字段为BCD格式,则BCD个数由isFullBCD决定
* @param isFullBCD 字段为BCD格式时有效。当isFullBCD为true时,value里存储的都为BCD位数,此时传入的BCD个数为value.length * 2;反之value里有补位了一个BCD个数,传入的BCD的个数应为value.length * 2 - 1。
* @return
*/
public boolean setField(int fieldNum, byte[] value, boolean isFullBCD) {
try {
Integer fieldNumInteger = new Integer(fieldNum);
Iso8583Package.Iso8583Field fieldConfig = iso8583FieldConfigs.get(fieldNumInteger); // 域配置
Iso8583Package.DataStorageFormat dataStoreFormat = fieldConfig.getDataStorageFormat();
// 计算不同存储类型实际占用的存储个数(非后续字节数)
int dataLength = 0;
if (dataStoreFormat == Iso8583Package.DataStorageFormat.ASCII) {
dataLength = value.length;
} else if (dataStoreFormat == Iso8583Package.DataStorageFormat.BCD) {
// 判断value是否为有效的BCD值
if (!RegularUtils.doMatch("[0-9]*", ByteUtils.getHexString(value))) {
throw new RuntimeException("域赋值出错[FieldNum: " + fieldNum + ", Value(HEX): " + ByteUtils.getHexString(value) + "]!不是有效的BCD值");
}
dataLength = value.length * 2;
if (!isFullBCD) {
dataLength = dataLength - 1;
}
} else if (dataStoreFormat == Iso8583Package.DataStorageFormat.BINARY) {
dataLength = value.length;
} else {
return false;
}
// 判断个数是否大于配置值
if (dataLength > fieldConfig.getLength()) {
throw new RuntimeException("域赋值出错[FieldNum: " + fieldNum + ", Value(HEX): " + ByteUtils.getHexString(value) + "]!长度大于配置值" + fieldConfig.getLength());
}
// 封装字段值
Iso8583Package.FieldFormat fieldFormat = fieldConfig.getFieldFormat();
if (fieldFormat == Iso8583Package.FieldFormat.NONE) { // 定长
int fieldFixLength = fieldConfig.getLength(); // 配置项配置的定长长度,不同存储类型占用的存储个数(非后续字节数)
// 计算定长占用的字节数
int fieldFixContentBytesLength = 0; // 域内容占用的固定字节数
if (dataStoreFormat == Iso8583Package.DataStorageFormat.ASCII) {
fieldFixContentBytesLength = fieldFixLength;
} else if (dataStoreFormat == Iso8583Package.DataStorageFormat.BCD) {
fieldFixContentBytesLength = fieldFixLength % 2 == 0 ? fieldFixLength / 2 : (fieldFixLength / 2 + 1);
} else if (dataStoreFormat == Iso8583Package.DataStorageFormat.BINARY) {
fieldFixContentBytesLength = fieldFixLength;
}
if (value.length < fieldFixContentBytesLength) {
byte padByte = (byte) (fieldConfig.getPadChar() == Iso8583Package.PadChar.NULL ? 0x00 : 0x20);
if (fieldConfig.align == Iso8583Package.Align.LEFT) {
value = ByteUtils.bytesPadRight(value, fieldFixContentBytesLength, padByte);
} else if (fieldConfig.align == Iso8583Package.Align.RIGHT) {
value = ByteUtils.bytesPadLeft(value, fieldFixContentBytesLength, padByte);
}
}
} else { // 不定长
// 长度字节数(LL..L 占用的字节数)
int lengthBytesLength = this.getVarLengthBytesLength(fieldFormat);
byte[] bytes = new byte[lengthBytesLength + value.length]; // 变长占用lengthBytesLength字节
if (this.varLengthFormat == Iso8583Package.VarLengthFormat.BCD) {
ByteUtils.writeBCD(bytes, 0, dataLength, lengthBytesLength); // 用压缩的BCD码表示
} else if (this.varLengthFormat == Iso8583Package.VarLengthFormat.ASCII) {
ByteUtils.writeLong(bytes, 0, dataLength, lengthBytesLength);
} else if (this.varLengthFormat == Iso8583Package.VarLengthFormat.NUMBER_STRING) {
ByteUtils.writeString(bytes, 0, StringUtils.padLeft(dataLength + "", lengthBytesLength, '0'), lengthBytesLength);
} else {
return false;
}
System.arraycopy(value, 0, bytes, lengthBytesLength, value.length);
value = bytes;
}
this.fieldsData.put(new Integer(fieldNum), value);
setBitMap(fieldNum, 1);
return true;
} catch (Exception e) {
String msg = "域赋值出错[FieldNum: " + fieldNum + ", Value(byte[]): " + ByteUtils.getHexString(value) + "]!";
throw new RuntimeException(e.getMessage() == null ? msg : (e.getMessage().startsWith("域赋值出错") ? e.getMessage() : msg + e.getMessage()));
}
}
/******* 取值 *************************************************************************/
/**
* 以16进制字符串格式读取域的值,若读取失败则返回null
* @param fieldNum
* @return
*/
public String getFieldHexStringValue(int fieldNum) {
try {
byte[] bytes = this.getFieldBytesValue(fieldNum);
return ByteUtils.getHexString(bytes);
} catch (Exception e) {
return null;
}
}
/**
* 以BCD格式读取域的值,若读取失败则返回null
* @param fieldNum
* @param charsetName
* @return
*/
public String getFieldBCDValue(int fieldNum) {
try {
String hex = getFieldHexStringValue(fieldNum);
Iso8583Package.Iso8583Field fieldConfig = iso8583FieldConfigs.get(fieldNum);
if (fieldConfig.getDataStorageFormat() == Iso8583Package.DataStorageFormat.BCD) { // BCD另行处理
int bcdCount = 0; // BCD个数
if (fieldConfig.fieldFormat == Iso8583Package.FieldFormat.NONE) {
bcdCount = fieldConfig.getLength();
} else {
bcdCount = this.getVarLength(fieldNum);
}
if (fieldConfig.getAlign() == Iso8583Package.Align.LEFT) {
hex = hex.substring(0, bcdCount);
} else {
hex = hex.substring(hex.length() - bcdCount);
}
}
return hex;
} catch (Exception e) {
return null;
}
}
/**
* 以String格式读取域的值,编码类型为charsetName,若读取失败则返回null
* @param fieldNum
* @param charsetName
* @return
*/
public String getFieldStringValue(int fieldNum, String charsetName) {
try {
byte[] bytes = this.getFieldBytesValue(fieldNum);
return new String(bytes, charsetName);
} catch (Exception e) {
return null;
}
}
/**
* 以String格式读取域的值,编码类型为UTF-8,若读取失败则返回null
* @param fieldNum
* @return
*/
public String getFieldStringValue(int fieldNum) {
try {
return getFieldStringValue(fieldNum, "UTF-8");
} catch (Exception e) {
return null;
}
}
/**
* 以Int格式读取域的值,若读取失败则返回-1
* @param fieldNum
* @return
*/
public int getFieldIntValue(int fieldNum) {
try {
String str = this.getFieldStringValue(fieldNum);
return Integer.parseInt(str);
} catch (Exception e) {
return -1;
}
}
/**
* 以byte[]格式读取域的值(如果是LLVAR等变长字段的话,则不包含长度字节)
* @param fieldNum
* @return
*/
public byte[] getFieldBytesValue(int fieldNum) {
byte[] bytes = this.getFieldBytesValueWithLength(fieldNum);
Iso8583Package.Iso8583Field fieldConfig = iso8583FieldConfigs.get(new Integer(fieldNum)); // 域配置
if (bytes == null || fieldConfig == null) {
return null;
}
Iso8583Package.FieldFormat fieldFormat = fieldConfig.getFieldFormat();
// 变长占用的字节数
int lengthBytesLength = this.getVarLengthBytesLength(fieldFormat);
return ByteUtils.getSubBytesByIndex(bytes, lengthBytesLength, bytes.length - 1);
}
/**
* 以byte[]格式读取域的值(如果是LLVAR等变长字段的话,包含长度字节)
* @param fieldNum
* @return
*/
public byte[] getFieldBytesValueWithLength(int fieldNum) {
return fieldsData.get(new Integer(fieldNum));
}
/**
* 删除域(2~64/128)
* @param fieldNum
* @return
*/
public boolean deleteField(int fieldNum) {
if (fieldNum < 2 || fieldNum > bitMapBytes.length * 8) {
return false;
}
setBitMap(fieldNum, 0);
this.fieldsData.remove(new Integer(fieldNum));
return true;
}
/**
* 判断是否存在域fieldNum
* @param filedNum
* @return
*/
public boolean existsField(int fieldNum) {
try {
if (fieldNum == 1) {
return true;
}
String bitMapStr = ByteUtils.getBinaryString(bitMapBytes);
return bitMapStr.charAt(fieldNum - 1) == '1';
} catch (Exception e) {
return false;
}
}
/**
* 获取所有域信息(默认UTF-8编码)
* @return
*/
public String fieldsDataToString() {
return fieldsDataToString("UTF-8");
}
/**
* 获取所有域信息
* @return
*/
public String fieldsDataToString(String charsetName) {
StringBuffer result = new StringBuffer();
result.append("----------------------------------------------------------------------------------" + System.getProperty("line.separator"));
//result.append("Fld:Field BytLen:BytesLength(字节长度) LenByt:LengthBytes(变长长度字节)" + System.getProperty("line.separator"));
String bitMapStr = ByteUtils.getBinaryString(bitMapBytes);
int bitMapStrLength = bitMapStr.length();
for (int i = 0; i < bitMapStrLength; i++) {
if (bitMapStr.charAt(i) == '1' || i == 0) {
result.append(fieldDataToString(i + 1, charsetName) + System.getProperty("line.separator"));
}
}
result.append("----------------------------------------------------------------------------------");
return result.toString();
}
/**
* 获取指定域信息(默认UTF-8编码)
* @param fieldNum
* @return
*/
public String fieldDataToString(int fieldNum) {
return fieldDataToString(fieldNum, "UTF-8");
}
/**
* 获取指定域信息
* @param fieldNum
* @return
*/
public String fieldDataToString(int fieldNum, String charsetName) {
try {
StringBuffer result = new StringBuffer();
Integer fieldNumInteger = fieldNum;
result.append("[Fld: " + StringUtils.padLeft(fieldNumInteger + "", 2, ' ') + "]");
byte[] fieldData = fieldsData.get(fieldNumInteger); // 域字节值
Iso8583Package.Iso8583Field fieldConfig = iso8583FieldConfigs.get(fieldNumInteger); // 域配置
Iso8583Package.FieldFormat fieldFormat = fieldConfig.getFieldFormat();
Iso8583Package.DataStorageFormat dataStorageFormat = fieldConfig.getDataStorageFormat();
// 变长占用的字节数
int lengthBytesLength = this.getVarLengthBytesLength(fieldFormat);
result.append("[" + StringUtils.padLeft((dataStorageFormat + "").substring(0, 3), 3, ' ') + "]");
byte[] fieldContentData = new byte[] {}; // 除去变长部分后的字节内容
if (lengthBytesLength > 0) {
byte[] lengthBytes = ByteUtils.getSubBytesByIndex(fieldData, 0, lengthBytesLength - 1);
String lengthBytesStr = ByteUtils.getHexString(lengthBytes);
result.append("[MaxLen: " + StringUtils.padLeft(fieldConfig.getLength() + "", 3, ' ') + "]");
result.append("[BytLen: " + StringUtils.padLeft(fieldData.length - lengthBytesLength + "", 3, ' ') + "]");
result.append("[(HEX)" + ByteUtils.getHexString(fieldData) + "]");
result.append("[LenByt(HEX): " + lengthBytesStr + "(" + this.getVarLength(fieldNum) + ")]");
fieldContentData = ByteUtils.getSubBytesByIndex(fieldData, lengthBytesLength, fieldData.length - 1);
} else {
result.append("[FixLen: " + StringUtils.padLeft(fieldConfig.getLength() + "", 3, ' ') + "]");
result.append("[BytLen: " + StringUtils.padLeft(fieldData.length + "", 3, ' ') + "]");
result.append("[(HEX)" + ByteUtils.getHexString(fieldData) + "]");
fieldContentData = fieldData;
}
if (dataStorageFormat == Iso8583Package.DataStorageFormat.ASCII) {
result.append("[(ASCII)" + new String(fieldContentData, charsetName) + "]");
} else if (dataStorageFormat == Iso8583Package.DataStorageFormat.BCD) {
result.append("[(BCD)" + this.getFieldBCDValue(fieldNum) + "]");
}
return result.toString();
} catch (Exception e) {
return "获取域信息[Field: " + fieldNum + ", Charset: " + charsetName + "]失败!" + e.getMessage() == null ? "" : e.getMessage();
}
}
/**
* 获取不定长字段的长度部分字节长
* @param fieldFormat
* @return
*/
private int getVarLengthBytesLength(Iso8583Package.FieldFormat fieldFormat) {
int lengthBytesLength = 0; // 变长占用的字节数
if (this.varLengthFormat == Iso8583Package.VarLengthFormat.BCD) {
if (fieldFormat == Iso8583Package.FieldFormat.LVAR || fieldFormat == Iso8583Package.FieldFormat.LLVAR) {
lengthBytesLength = 1;
} else if (fieldFormat == Iso8583Package.FieldFormat.LLLVAR || fieldFormat == Iso8583Package.FieldFormat.LLLLVAR) {
lengthBytesLength = 2;
}
} else if (this.varLengthFormat == Iso8583Package.VarLengthFormat.ASCII || this.varLengthFormat == Iso8583Package.VarLengthFormat.NUMBER_STRING) {
if (fieldFormat == Iso8583Package.FieldFormat.LVAR) {
lengthBytesLength = 1;
} else if (fieldFormat == Iso8583Package.FieldFormat.LLVAR) {
lengthBytesLength = 2;
} else if (fieldFormat == Iso8583Package.FieldFormat.LLLVAR) {
lengthBytesLength = 3;
} else if (fieldFormat == Iso8583Package.FieldFormat.LLLLVAR) {
lengthBytesLength = 4;
}
}
return lengthBytesLength;
}
/**
* 获取不定长字段的长度值(实际个数)
* @param fieldNum
* @return
*/
private int getVarLength(int fieldNum) {
Iso8583Package.Iso8583Field fieldConfig = iso8583FieldConfigs.get(fieldNum);
long varLength = 0;
// 计算不定长实际个数
Iso8583Package.FieldFormat fieldFormat = fieldConfig.getFieldFormat();
if (fieldFormat != Iso8583Package.FieldFormat.NONE) {
// 长度字节数(LL..L 占用的字节数)
int lengthBytesLength = this.getVarLengthBytesLength(fieldFormat);
byte[] iso8583FieldBytes = this.getFieldBytesValueWithLength(fieldNum);
if (this.varLengthFormat == Iso8583Package.VarLengthFormat.BCD) {
varLength = ByteUtils.readBCD(iso8583FieldBytes, 0, lengthBytesLength);
} else if (this.varLengthFormat == Iso8583Package.VarLengthFormat.ASCII) {
varLength = ByteUtils.readLong(iso8583FieldBytes, 0, lengthBytesLength);
} else if (this.varLengthFormat == Iso8583Package.VarLengthFormat.NUMBER_STRING) {
varLength = Long.parseLong(ByteUtils.readString(iso8583FieldBytes, 0, lengthBytesLength));
}
}
return (int) varLength;
}
// getter setter
/**
* 报文总的内容, messageTypeBytes + iso8583FieldsBytes
* @return
*/
public byte[] getTotalMessageBytes() {
byte[] iso8583FieldsBytes = this.getIso8583FieldsBytes();
byte[] total = new byte[this.messageTypeBytes.length + iso8583FieldsBytes.length];
int idx = 0;
for (int i = 0; i < this.messageTypeBytes.length; i++) {
total[idx++] = this.messageTypeBytes[i];
}
for (int i = 0; i < iso8583FieldsBytes.length; i++) {
total[idx++] = iso8583FieldsBytes[i];
}
return total;
}
/**
* 获取BCD编码的消息类型
* @return
*/
public String getMessageType() {
return ByteUtils.getHexString(this.messageTypeBytes);
}
/**
* messageType由2字节组成
* @param messageType
*/
public void setMessageType(byte[] messageTypeBytes) {
if (messageTypeBytes == null || messageTypeBytes.length != 2) {
throw new RuntimeException("参数值[messageType: " + ByteUtils.getHexString(messageTypeBytes) + "]有误!");
}
this.messageTypeBytes = messageTypeBytes;
}
/**
* messageType由[0-9/a-f/A-F]组成(2个字节十六进制表示)
* @param messageType
*/
public void setMessageType(String messageType) {
if (!RegularUtils.doMatch("[0-9a-fA-F]{4}", messageType)) {
throw new RuntimeException("参数值[messageType: " + messageType + "]有误!");
}
this.messageTypeBytes = ByteUtils.hexStringToBytes(messageType);
}
/**
* 获取ISO8583域1-64/128字节数组
* @return
*/
public byte[] getIso8583FieldsBytes() {
String resultStr = "";
String bitMapStr = ByteUtils.getBinaryString(bitMapBytes);
int bitMapStrLength = bitMapStr.length();
for (int i = 0; i < bitMapStrLength; i++) {
if (bitMapStr.charAt(i) == '1' || i == 0) {
resultStr += ByteUtils.getHexString(this.fieldsData.get(new Integer(i + 1)));
}
}
byte[] result = ByteUtils.hexStringToBytes(resultStr);
return result == null ? new byte[0] : result;
}
/****************** 内部类 *******************************************/
// <!-- 说明 -->
// <!-- <iso8583Field> -->
// <!-- <fieldNum>域, 1-128</fieldNum> -->
// <!-- <fieldName>域名称</fieldName> -->
// <!-- <dataStorageFormat>域数据存储格式, ASCII码格式存储, BINARY格式存储, BCD格式存储</dataStorageFormat> -->
// <!-- <length>长度</length> -->
// <!-- <fieldFormat>域内容格式, None: 无, LVAR: 1个字节BCD表示的长度位后面跟上这些长度的字节, LLVAR: 1个字节BCD长度位, LLLVAR: 2个字节BCD长度位置, LLLLVAR: 2个字节BCD长度位置</fieldFormat> -->
// <!-- <align>数据对齐方式, Left, Right</align> -->
// <!-- <padChar>填充字符, Null: 不填充, Space: 填充空格</padChar> -->
// <!-- </iso8583Field> -->
private class Iso8583Field {
private int fieldNum;
private String fieldName;
private Iso8583Package.DataStorageFormat dataStorageFormat;
private int length;
private Iso8583Package.FieldFormat fieldFormat;
private Iso8583Package.Align align;
private Iso8583Package.PadChar padChar;
public String toString() {
return "fieldNum: " + fieldNum + ", fieldName: " + fieldName + ", dataStorageFormat: " + dataStorageFormat + ", length: " + length + ", fieldFormat: " + fieldFormat + ", align: " + align + ", padChar: " + padChar;
}
public int getFieldNum() {
return fieldNum;
}
public void setFieldNum(int fieldNum) {
this.fieldNum = fieldNum;
}
public String getFieldName() {
return fieldName;
}
public void setFieldName(String fieldName) {
this.fieldName = fieldName;
}
public Iso8583Package.DataStorageFormat getDataStorageFormat() {
return dataStorageFormat;
}
public void setDataStorageFormat(Iso8583Package.DataStorageFormat dataStorageFormat) {
this.dataStorageFormat = dataStorageFormat;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public Iso8583Package.FieldFormat getFieldFormat() {
return fieldFormat;
}
public void setFieldFormat(Iso8583Package.FieldFormat fieldFormat) {
this.fieldFormat = fieldFormat;
}
public Iso8583Package.Align getAlign() {
return align;
}
public void setAlign(Iso8583Package.Align align) {
this.align = align;
}
public Iso8583Package.PadChar getPadChar() {
return padChar;
}
public void setPadChar(Iso8583Package.PadChar padChar) {
this.padChar = padChar;
}
}
/****************** 枚举定义 *******************************************/
/**
* 数据存储格式
*/
public enum DataStorageFormat {
ASCII, BCD, BINARY;
}
/**
* 域内容格式
*/
public enum FieldFormat {
NONE, LVAR, LLVAR, LLLVAR, LLLLVAR;
}
/**
* 数据对齐方式
*/
public enum Align {
LEFT, RIGHT;
}
/**
* 填充字符
*/
public enum PadChar {
NULL, SPACE;
}
/**
* 变长字段的长度部分存储格式<br>
* BCD: 长度存储格式为压缩的BCD码, LVAR和LLVAR长度占用一个字节, LLLVAR和LLLLVAR长度占用两个字节.<br>
* ASCII: 长度存储格式为ASCII, LVAR长度占用一个字节, LLVAR占用两个字节, LLLVAR占用三个字节, LLLLVAR占用四个字节.<br>
* NUMBER_STRING: 长度存储格式为数字字符串, 位数为1-4位, 对应L-LLLL, 占用字节数同ASCII格式.<br>
*/
public enum VarLengthFormat {
BCD, ASCII, NUMBER_STRING
}
}
2、配置文件
<?xml version="1.0" encoding="utf-8"?>
<iso8583Fields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- 说明 -->
<!-- <iso8583Field> -->
<!-- <fieldNum>域, 1-128</fieldNum> -->
<!-- <fieldName>域名称</fieldName> -->
<!-- <dataStorageFormat>域数据存储格式, ASCII: ASCII码格式存储, BINARY: 二进制格式存储, BCD: 压缩的BCD格式存储</dataStorageFormat> -->
<!-- <length>长度. 当dataStorageFormat为ASCII时, 表示字节个数; 当dataStorageFormat为BINARY时, 表示字节数; 当dataStorageFormat为BCD时, 表示BCD字符个数(字节个数=BCD字符数/2)</length> -->
<!-- <fieldFormat>域内容格式, None: 无, LVAR: 1个字节BCD表示的长度位(长度定义同length), LLVAR: 1个字节BCD表示的长度位, LLLVAR: 2个字节BCD表示的长度位置, LLLLVAR: 2个字节BCD表示的长度位置</fieldFormat> -->
<!-- <align>数据对齐方式, Left, Right</align> -->
<!-- <padChar>填充字符, Null: 不填充, Space: 填充空格</padChar> -->
<!-- </iso8583Field> -->
<iso8583Field>
<fieldNum>1</fieldNum>
<fieldName>Bit Map</fieldName>
<dataStorageFormat>BINARY</dataStorageFormat>
<length>8</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>2</fieldNum>
<fieldName>Primary Account Number</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>19</length>
<fieldFormat>LLVAR</fieldFormat>
<align>Left</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>3</fieldNum>
<fieldName>Processing Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>6</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>4</fieldNum>
<fieldName>Amount Transaction</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>12</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>5</fieldNum>
<fieldName>Transmission Date & Time</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>12</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>6</fieldNum>
<fieldName>System Trace Audit Number</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>12</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>7</fieldNum>
<fieldName>Time Local Transaction</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>14</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>8</fieldNum>
<fieldName>Date Local Transaction</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>8</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>9</fieldNum>
<fieldName>Point-of-Service Condition Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>8</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>10</fieldNum>
<fieldName>对帐流水号</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>8</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>11</fieldNum>
<fieldName>Acquiring Institution Identification Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>6</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>12</fieldNum>
<fieldName>Forwarding Institution Identofication Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>6</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>13</fieldNum>
<fieldName>Terminal Identification</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>8</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>14</fieldNum>
<fieldName>Identification Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>4</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>15</fieldNum>
<fieldName>Additional Data - National</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>4</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>16</fieldNum>
<fieldName>Additional Data - Private</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>4</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>17</fieldNum>
<fieldName>Security Related Control Information</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>4</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>18</fieldNum>
<fieldName>Account Identification 1</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>4</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>19</fieldNum>
<fieldName>扣款帐号</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>3</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>20</fieldNum>
<fieldName>Bit Map Extended</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>3</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>21</fieldNum>
<fieldName>Primary Account Number</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>3</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>22</fieldNum>
<fieldName>POINT OF SERVICE ENTRY MODE</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>3</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>23</fieldNum>
<fieldName>Amount Transaction</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>3</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>24</fieldNum>
<fieldName>Transmission Date & Time</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>3</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>25</fieldNum>
<fieldName>POINT OF SERVICE CONDITION CODE</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>2</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>26</fieldNum>
<fieldName>POINT OF SERVICE PIN CAPTURE CODE</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>2</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>27</fieldNum>
<fieldName>Date Local Transaction</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>1</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>28</fieldNum>
<fieldName>Point-of-Service Condition Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>1</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>29</fieldNum>
<fieldName>对帐流水号</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>8</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>30</fieldNum>
<fieldName>Acquiring Institution Identification Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>8</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>31</fieldNum>
<fieldName>Forwarding Institution Identofication Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>8</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>32</fieldNum>
<fieldName>Terminal Identification</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>11</length>
<fieldFormat>LLVAR</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>33</fieldNum>
<fieldName>Identification Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>11</length>
<fieldFormat>LLVAR</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>34</fieldNum>
<fieldName>Additional Data - National</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>28</length>
<fieldFormat>LLVAR</fieldFormat>
<align>Left</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>35</fieldNum>
<fieldName>Additional Data - Private</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>37</length>
<fieldFormat>LLVAR</fieldFormat>
<align>Left</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>36</fieldNum>
<fieldName>Security Related Control Information</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>104</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>37</fieldNum>
<fieldName>Account Identification 1</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>12</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>38</fieldNum>
<fieldName>扣款帐号</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>6</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>39</fieldNum>
<fieldName>Bit Map Extended</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>2</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>40</fieldNum>
<fieldName>Primary Account Number</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>41</fieldNum>
<fieldName>Processing Code</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>15</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>42</fieldNum>
<fieldName>Amount Transaction</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>12</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>43</fieldNum>
<fieldName>Transmission Date & Time</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>40</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>44</fieldNum>
<fieldName>System Trace Audit Number</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>99</length>
<fieldFormat>LLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>45</fieldNum>
<fieldName>Time Local Transaction</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>76</length>
<fieldFormat>LLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>46</fieldNum>
<fieldName>Date Local Transaction</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>47</fieldNum>
<fieldName>Point-of-Service Condition Code</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>48</fieldNum>
<fieldName>对帐流水号</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>9999</length>
<fieldFormat>LLLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>49</fieldNum>
<fieldName>Acquiring Institution Identification Code</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>3</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>50</fieldNum>
<fieldName>Forwarding Institution Identofication Code</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>3</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>51</fieldNum>
<fieldName>Terminal Identification</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>3</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>52</fieldNum>
<fieldName>Identification Code</fieldName>
<dataStorageFormat>BINARY</dataStorageFormat>
<length>8</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>53</fieldNum>
<fieldName>Additional Data - National</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>16</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>54</fieldNum>
<fieldName>Additional Data - Private</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>99</length>
<fieldFormat>LLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>55</fieldNum>
<fieldName>Security Related Control Information</fieldName>
<dataStorageFormat>BINARY</dataStorageFormat>
<length>9999</length>
<fieldFormat>LLLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>56</fieldNum>
<fieldName>Account Identification 1</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Right</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>57</fieldNum>
<fieldName>扣款帐号</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>58</fieldNum>
<fieldName>Bit Map Extended</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>59</fieldNum>
<fieldName>Primary Account Number</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>60</fieldNum>
<fieldName>Processing Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>61</fieldNum>
<fieldName>Amount Transaction</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>62</fieldNum>
<fieldName>Transmission Date & Time</fieldName>
<dataStorageFormat>BINARY</dataStorageFormat>
<length>512</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>63</fieldNum>
<fieldName>System Trace Audit Number</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>64</fieldNum>
<fieldName>Time Local Transaction</fieldName>
<dataStorageFormat>BINARY</dataStorageFormat>
<length>8</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>65</fieldNum>
<fieldName>Date Local Transaction</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>8</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>66</fieldNum>
<fieldName>Point-of-Service Condition Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>1</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>67</fieldNum>
<fieldName>对帐流水号</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>2</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>68</fieldNum>
<fieldName>Acquiring Institution Identification Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>3</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>69</fieldNum>
<fieldName>Forwarding Institution Identofication Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>3</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>70</fieldNum>
<fieldName>Terminal Identification</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>3</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>71</fieldNum>
<fieldName>Identification Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>4</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>72</fieldNum>
<fieldName>Additional Data - National</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>4</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>73</fieldNum>
<fieldName>Additional Data - Private</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>6</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>74</fieldNum>
<fieldName>Security Related Control Information</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>10</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>75</fieldNum>
<fieldName>Account Identification 1</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>10</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>76</fieldNum>
<fieldName>扣款帐号</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>10</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>77</fieldNum>
<fieldName>Bit Map Extended</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>10</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>78</fieldNum>
<fieldName>Primary Account Number</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>10</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>79</fieldNum>
<fieldName>Processing Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>10</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>80</fieldNum>
<fieldName>Amount Transaction</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>10</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>81</fieldNum>
<fieldName>Transmission Date & Time</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>10</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>82</fieldNum>
<fieldName>System Trace Audit Number</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>12</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>83</fieldNum>
<fieldName>Time Local Transaction</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>12</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>84</fieldNum>
<fieldName>Date Local Transaction</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>12</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>85</fieldNum>
<fieldName>Point-of-Service Condition Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>12</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>86</fieldNum>
<fieldName>对帐流水号</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>16</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>87</fieldNum>
<fieldName>Acquiring Institution Identification Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>16</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>88</fieldNum>
<fieldName>Forwarding Institution Identofication Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>16</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>89</fieldNum>
<fieldName>Terminal Identification</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>16</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>90</fieldNum>
<fieldName>Identification Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>42</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>91</fieldNum>
<fieldName>Additional Data - National</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>1</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>92</fieldNum>
<fieldName>Additional Data - Private</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>2</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>93</fieldNum>
<fieldName>Security Related Control Information</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>5</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>94</fieldNum>
<fieldName>Account Identification 1</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>7</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>95</fieldNum>
<fieldName>扣款帐号</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>42</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>96</fieldNum>
<fieldName>Bit Map Extended</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>8</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>97</fieldNum>
<fieldName>Primary Account Number</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>16</length>
<fieldFormat>None</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>98</fieldNum>
<fieldName>Processing Code</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>25</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>99</fieldNum>
<fieldName>Amount Transaction</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>11</length>
<fieldFormat>LLVAR</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>100</fieldNum>
<fieldName>Transmission Date & Time</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>11</length>
<fieldFormat>LLVAR</fieldFormat>
<align>Right</align>
<padChar>Null</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>101</fieldNum>
<fieldName>System Trace Audit Number</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>17</length>
<fieldFormat>LLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>102</fieldNum>
<fieldName>Time Local Transaction</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>28</length>
<fieldFormat>LLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>103</fieldNum>
<fieldName>Date Local Transaction</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>28</length>
<fieldFormat>LLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>104</fieldNum>
<fieldName>Point-of-Service Condition Code</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>100</length>
<fieldFormat>LLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>105</fieldNum>
<fieldName>对帐流水号</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>106</fieldNum>
<fieldName>Acquiring Institution Identification Code</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>107</fieldNum>
<fieldName>Forwarding Institution Identofication Code</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>108</fieldNum>
<fieldName>Terminal Identification</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>109</fieldNum>
<fieldName>Identification Code</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>110</fieldNum>
<fieldName>Additional Data - National</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>111</fieldNum>
<fieldName>Additional Data - Private</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>112</fieldNum>
<fieldName>Security Related Control Information</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>113</fieldNum>
<fieldName>Account Identification 1</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>114</fieldNum>
<fieldName>扣款帐号</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>115</fieldNum>
<fieldName>Bit Map Extended</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>116</fieldNum>
<fieldName>Primary Account Number</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>117</fieldNum>
<fieldName>Processing Code</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>118</fieldNum>
<fieldName>Amount Transaction</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>119</fieldNum>
<fieldName>Transmission Date & Time</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>120</fieldNum>
<fieldName>System Trace Audit Number</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>121</fieldNum>
<fieldName>Time Local Transaction</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>122</fieldNum>
<fieldName>Date Local Transaction</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>123</fieldNum>
<fieldName>Point-of-Service Condition Code</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>124</fieldNum>
<fieldName>对帐流水号</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>125</fieldNum>
<fieldName>Acquiring Institution Identification Code</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>126</fieldNum>
<fieldName>Forwarding Institution Identofication Code</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>127</fieldNum>
<fieldName>Terminal Identification</fieldName>
<dataStorageFormat>ASCII</dataStorageFormat>
<length>999</length>
<fieldFormat>LLLVAR</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
<iso8583Field>
<fieldNum>128</fieldNum>
<fieldName>Identification Code</fieldName>
<dataStorageFormat>BCD</dataStorageFormat>
<length>8</length>
<fieldFormat>None</fieldFormat>
<align>Left</align>
<padChar>Space</padChar>
</iso8583Field>
</iso8583Fields>