package msgsentry.msj.auth.isocommon; import java.util.BitSet; import org.jpos.iso.IFB_BITMAP; import org.jpos.iso.ISOBitMapPackager; import org.jpos.iso.ISOComponent; import org.jpos.iso.ISOException; import org.jpos.iso.ISOUtil; /** * ISOFieldPackager Binary Bitmap * * @author apr@cs.com.uy * @version $Id$ * @see ISOComponent * @see ISOBitMapPackager */ public class ISD_IFB_BITMAP extends IFB_BITMAP { public ISD_IFB_BITMAP() { super(); } /** * @param len - field len * @param description symbolic descrption */ public ISD_IFB_BITMAP(int len, String description) { super(len, description); } /** * @param c - a component * @return packed component * @exception ISOException */ public byte[] pack (ISOComponent c) throws ISOException { return bitSet2byte ((BitSet) c.getValue()); } /** * converts a BitSet into a binary field * used in pack routines * @param b - the BitSet * @param fieldLength - the length of the BITMAP * @return binary representation */ public byte[] bitSet2byte (BitSet b) { int fieldLength = getLength(); int len = (b.length() > 65) ? 128 : 64; //Addition for BITMAPs lesser than 8 bytes if(fieldLength < 8 ) len = fieldLength * 8; byte[] d = new byte[len >> 3]; for (int i=0; i<len; i++) if (b.get(i+1)) d[i >> 3] |= (0x80 >> (i % 8)); if (len>64) d[0] |= 0x80; return d; } /** * @param c - the Component to unpack * @param b - binary image * @param offset - starting offset within the binary image * @return consumed bytes * @exception ISOException */ /*public int unpack (ISOComponent c, byte[] b, int offset) throws ISOException { //int len; BitSet bmap = ISOUtil.byte2BitSet (b, offset, getLength() > 8); c.setValue(bmap); //len = (bmap.get(1) == true) ? 128 : 64; return (getLength()); }*/ /** * Converts a binary representation of a Bitmap field * into a Java BitSet * @param b - binary representation * @param offset - staring offset * @param bitZeroMeansExtended - true for ISO-8583 * @return java BitSet object */ public BitSet byte2BitSet (byte[] b, int offset, boolean bitZeroMeansExtended) { int fieldLength = getLength(); //for (int i=0; i<b.length; i++) // System.out.print(" " + b[i]); int len = bitZeroMeansExtended ? ((b[offset] & 0x80) == 0x80 ? 128 : 64) : 64; if(fieldLength < 8 ) len = fieldLength * 8; BitSet bmap = new BitSet (len); for (int i=0; i<len; i++) if (((b[offset + (i >> 3)]) & (0x80 >> (i % 8))) > 0) bmap.set(i+1); return bmap; } public int unpack (ISOComponent c, byte[] b, int offset) throws ISOException { int len; BitSet bmap = byte2BitSet (b, offset, getLength() > 8); c.setValue(bmap); len = (bmap.get(1) == true) ? 128 : 64; /* changed by Hani */ return (Math.min (getLength(), len >> 3)); } }