From 360cb3e3e5075b2e640d89bac22a9ec3fe24ee7c Mon Sep 17 00:00:00 2001 From: Enrique Zamudio Date: Tue, 17 Apr 2018 14:59:48 -0500 Subject: [PATCH] enable right-padding for BCD codecs #66 --- .../solab/iso8583/codecs/BigIntBcdCodec.java | 18 ++++++++++++++++-- .../com/solab/iso8583/codecs/LongBcdCodec.java | 18 ++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/solab/iso8583/codecs/BigIntBcdCodec.java b/src/main/java/com/solab/iso8583/codecs/BigIntBcdCodec.java index 9d04a01..ad6c32d 100644 --- a/src/main/java/com/solab/iso8583/codecs/BigIntBcdCodec.java +++ b/src/main/java/com/solab/iso8583/codecs/BigIntBcdCodec.java @@ -32,16 +32,30 @@ import java.math.BigInteger; */ public class BigIntBcdCodec implements CustomBinaryField { + private final boolean rightPadded; + + public BigIntBcdCodec() { + this(false); + } + public BigIntBcdCodec(boolean rightPadded) { + this.rightPadded = rightPadded; + } + @Override public BigInteger decodeBinaryField(byte[] value, int pos, int len) { - return Bcd.decodeToBigInteger(value, pos, len*2); + return rightPadded ? Bcd.decodeRightPaddedToBigInteger(value, pos, len*2) + : Bcd.decodeToBigInteger(value, pos, len*2); } @Override public byte[] encodeBinaryField(BigInteger value) { final String s = value.toString(10); final byte[] buf = new byte[s.length() / 2 + s.length() % 2]; - Bcd.encode(s, buf); + if (rightPadded) { + Bcd.encodeRightPadded(s, buf); + } else { + Bcd.encode(s, buf); + } return buf; } diff --git a/src/main/java/com/solab/iso8583/codecs/LongBcdCodec.java b/src/main/java/com/solab/iso8583/codecs/LongBcdCodec.java index 7f33b47..aae0f5d 100644 --- a/src/main/java/com/solab/iso8583/codecs/LongBcdCodec.java +++ b/src/main/java/com/solab/iso8583/codecs/LongBcdCodec.java @@ -30,16 +30,30 @@ import com.solab.iso8583.util.Bcd; */ public class LongBcdCodec implements CustomBinaryField { + private final boolean rightPadded; + + public LongBcdCodec() { + this(false); + } + public LongBcdCodec(boolean rightPadding) { + rightPadded = rightPadding; + } + @Override public Long decodeBinaryField(byte[] value, int pos, int length) { - return Bcd.decodeToLong(value, pos, length*2); + return rightPadded ? Bcd.decodeRightPaddedToLong(value, pos, length*2) + : Bcd.decodeToLong(value, pos, length*2); } @Override public byte[] encodeBinaryField(Long value) { final String s = Long.toString(value, 10); final byte[] buf = new byte[s.length() / 2 + s.length() % 2]; - Bcd.encode(s, buf); + if (rightPadded) { + Bcd.encodeRightPadded(s, buf); + } else { + Bcd.encode(s, buf); + } return buf; }