001 /**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements. See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package org.apache.geronimo.util.encoders;
020
021 /**
022 * Converters for going from hex to binary and back. Note: this class assumes ASCII processing.
023 */
024 public class HexTranslator
025 implements Translator
026 {
027 private static final byte[] hexTable =
028 {
029 (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', (byte)'7',
030 (byte)'8', (byte)'9', (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f'
031 };
032
033 /**
034 * size of the output block on encoding produced by getDecodedBlockSize()
035 * bytes.
036 */
037 public int getEncodedBlockSize()
038 {
039 return 2;
040 }
041
042 public int encode(
043 byte[] in,
044 int inOff,
045 int length,
046 byte[] out,
047 int outOff)
048 {
049 for (int i = 0, j = 0; i < length; i++, j += 2)
050 {
051 out[outOff + j] = hexTable[(in[inOff] >> 4) & 0x0f];
052 out[outOff + j + 1] = hexTable[in[inOff] & 0x0f];
053
054 inOff++;
055 }
056
057 return length * 2;
058 }
059
060 /**
061 * size of the output block on decoding produced by getEncodedBlockSize()
062 * bytes.
063 */
064 public int getDecodedBlockSize()
065 {
066 return 1;
067 }
068
069 public int decode(
070 byte[] in,
071 int inOff,
072 int length,
073 byte[] out,
074 int outOff)
075 {
076 int halfLength = length / 2;
077 byte left, right;
078 for (int i = 0; i < halfLength; i++)
079 {
080 left = in[inOff + i * 2];
081 right = in[inOff + i * 2 + 1];
082
083 if (left < (byte)'a')
084 {
085 out[outOff] = (byte)((left - '0') << 4);
086 }
087 else
088 {
089 out[outOff] = (byte)((left - 'a' + 10) << 4);
090 }
091 if (right < (byte)'a')
092 {
093 out[outOff] += (byte)(right - '0');
094 }
095 else
096 {
097 out[outOff] += (byte)(right - 'a' + 10);
098 }
099
100 outOff++;
101 }
102
103 return halfLength;
104 }
105 }