Java版ISO8583包解析工具

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>


8583协议是金融行业常用的一种通信协议,用于银行卡交易、ATM取款、POS刷卡等场景。下面是一个简单的8583协议解析工具的示例代码,使用Java语言实现。 首先,我们定义一个8583协议的数据结构,含以下属性: - TPDU:传输数据单元,长度为5个字节。 - Header:消息头,长度为6个字节。 - MTI:消息类型标识,长度为2个字节。 - Bitmap:位图,长度为8个字节。 - Data:数据域,长度不定,根据实际情况而定。 ```java public class ISO8583Packet { private byte[] TPDU; private byte[] header; private byte[] MTI; private byte[] bitmap; private Map<Integer, byte[]> dataElements; // getters and setters } ``` 下面是一个简单的组函数示例,将ISO8583Packet对象转换为字节数组: ```java public byte[] pack(ISO8583Packet packet) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { // pack TPDU baos.write(packet.getTPDU()); // pack Header baos.write(packet.getHeader()); // pack MTI baos.write(packet.getMTI()); // pack Bitmap baos.write(packet.getBitmap()); // pack Data Elements for (Map.Entry<Integer, byte[]> entry : packet.getDataElements().entrySet()) { baos.write(entry.getValue()); } return baos.toByteArray(); } catch (IOException e) { e.printStackTrace(); return null; } } ``` 下面是一个简单的解析函数示例,将字节数组转换为ISO8583Packet对象: ```java public ISO8583Packet unpack(byte[] data) { ISO8583Packet packet = new ISO8583Packet(); int offset = 0; try { // unpack TPDU byte[] TPDU = new byte[5]; System.arraycopy(data, offset, TPDU, 0, 5); packet.setTPDU(TPDU); offset += 5; // unpack Header byte[] header = new byte[6]; System.arraycopy(data, offset, header, 0, 6); packet.setHeader(header); offset += 6; // unpack MTI byte[] MTI = new byte[2]; System.arraycopy(data, offset, MTI, 0, 2); packet.setMTI(MTI); offset += 2; // unpack Bitmap byte[] bitmap = new byte[8]; System.arraycopy(data, offset, bitmap, 0, 8); packet.setBitmap(bitmap); offset += 8; // unpack Data Elements Map<Integer, byte[]> dataElements = new HashMap<>(); for (int i = 1; i <= 64; i++) { if (ISO8583Utils.isBitmapSet(bitmap, i)) { int length = ISO8583Utils.getElementLength(i); byte[] value = new byte[length]; System.arraycopy(data, offset, value, 0, length); dataElements.put(i, value); offset += length; } } packet.setDataElements(dataElements); return packet; } catch (Exception e) { e.printStackTrace(); return null; } } ``` 其中,ISO8583Utils类中含一些常用的工具方法,例如判断位图中某一位是否被设置、获取数据元素的长度等。 以上仅为一个简单的示例代码,实际的8583协议解析工具需要根据实际需求进行扩展和完善。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值