package org.bouncycastle.util.encoders; /** * Converters for going from hex to binary and back. Note: this class assumes ASCII processing. */ public class HexTranslator implements Translator { private static final byte[] hexTable = { (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f' }; /** * size of the output block on encoding produced by getDecodedBlockSize() * bytes. */ public int getEncodedBlockSize() { return 2; } public int encode( byte[] in, int inOff, int length, byte[] out, int outOff) { for (int i = 0, j = 0; i < length; i++, j += 2) { out[outOff + j] = hexTable[(in[inOff] >> 4) & 0x0f]; out[outOff + j + 1] = hexTable[in[inOff] & 0x0f]; inOff++; } return length * 2; } /** * size of the output block on decoding produced by getEncodedBlockSize() * bytes. */ public int getDecodedBlockSize() { return 1; } public int decode( byte[] in, int inOff, int length, byte[] out, int outOff) { int halfLength = length / 2; byte left, right; for (int i = 0; i < halfLength; i++) { left = in[inOff + i * 2]; right = in[inOff + i * 2 + 1]; if (left < (byte)'a') { out[outOff] = (byte)((left - '0') << 4); } else { out[outOff] = (byte)((left - 'a' + 10) << 4); } if (right < (byte)'a') { out[outOff] += (byte)(right - '0'); } else { out[outOff] += (byte)(right - 'a' + 10); } outOff++; } return halfLength; } }