001/* 002 * jPOS Project [http://jpos.org] 003 * Copyright (C) 2000-2026 jPOS Software SRL 004 * 005 * This program is free software: you can redistribute it and/or modify 006 * it under the terms of the GNU Affero General Public License as 007 * published by the Free Software Foundation, either version 3 of the 008 * License, or (at your option) any later version. 009 * 010 * This program is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 013 * GNU Affero General Public License for more details. 014 * 015 * You should have received a copy of the GNU Affero General Public License 016 * along with this program. If not, see <http://www.gnu.org/licenses/>. 017 */ 018 019package org.jpos.iso; 020 021/** 022 * Implements Hex Interpreter. The Hex digits are stored in ASCII. 023 * 024 * @author joconnor 025 * @version $Revision$ $Date$ 026 */ 027public class AsciiHexInterpreter implements BinaryInterpreter 028{ 029 /** Public constructor; prefer {@link #INSTANCE} for repeated use. */ 030 public AsciiHexInterpreter() {} 031 /** An instance of this Interpreter. Only one needed for the whole system */ 032 public static final AsciiHexInterpreter INSTANCE = new AsciiHexInterpreter(); 033 034 /** 0-15 to ASCII hex digit lookup table. */ 035 private static final byte[] HEX_ASCII = new byte[] { 036 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 037 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 038 }; 039 040 /** 041 * Converts the binary data into ASCII hex digits. 042 */ 043 public void interpret(byte[] data, byte[] b, int offset) 044 { 045 for (int i = 0; i < data.length; i++) { 046 b[offset + i * 2] = HEX_ASCII[(data[i] & 0xF0) >> 4]; 047 b[offset + i * 2 + 1] = HEX_ASCII[data[i] & 0x0F]; 048 } 049 } 050 051 /** 052 * Converts the ASCII hex digits into binary data. 053 */ 054 public byte[] uninterpret(byte[] rawData, int offset, int length) 055 { 056 byte[] d = new byte[length]; 057 for (int i=0; i<length*2; i++) { 058 int shift = i%2 == 1 ? 0 : 4; 059 d[i>>1] |= Character.digit((char) rawData[offset+i], 16) << shift; 060 } 061 return d; 062 } 063 064 /** 065 * Returns double nBytes because the hex representation of 1 byte needs 2 hex digits. 066 * 067 */ 068 public int getPackedLength(int nBytes) 069 { 070 return nBytes * 2; 071 } 072}