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 /** An instance of this Interpreter. Only one needed for the whole system */ 030 public static final AsciiHexInterpreter INSTANCE = new AsciiHexInterpreter(); 031 032 /** 0-15 to ASCII hex digit lookup table. */ 033 private static final byte[] HEX_ASCII = new byte[] { 034 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 035 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 036 }; 037 038 /** 039 * Converts the binary data into ASCII hex digits. 040 */ 041 public void interpret(byte[] data, byte[] b, int offset) 042 { 043 for (int i = 0; i < data.length; i++) { 044 b[offset + i * 2] = HEX_ASCII[(data[i] & 0xF0) >> 4]; 045 b[offset + i * 2 + 1] = HEX_ASCII[data[i] & 0x0F]; 046 } 047 } 048 049 /** 050 * Converts the ASCII hex digits into binary data. 051 */ 052 public byte[] uninterpret(byte[] rawData, int offset, int length) 053 { 054 byte[] d = new byte[length]; 055 for (int i=0; i<length*2; i++) { 056 int shift = i%2 == 1 ? 0 : 4; 057 d[i>>1] |= Character.digit((char) rawData[offset+i], 16) << shift; 058 } 059 return d; 060 } 061 062 /** 063 * Returns double nBytes because the hex representation of 1 byte needs 2 hex digits. 064 * 065 */ 066 public int getPackedLength(int nBytes) 067 { 068 return nBytes * 2; 069 } 070}