// ========================================================================
// Copyright 2008-2009 NEXCOM Systems
// ------------------------------------------------------------------------
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========================================================================
package com.rayo.core.sip;
public class HexString {
private static final char __hexChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
private static final char __hexCharsUC[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
public static void appendHex(StringBuffer buf, int c) {
buf.append(__hexCharsUC[(c & 0xf0) >> 4]);
buf.append(__hexCharsUC[c & 0x0f]);
}
public static String toHexString(String s) {
return toHexString(s.getBytes());
}
public static String toHexString(byte buffer[]) {
return toHexString(buffer, 0, buffer.length);
}
public static String toHexString(byte b[], int offset, int length) {
StringBuffer hex = new StringBuffer(2 * length);
for (int i = offset; i < offset + length; i++) {
hex.append(__hexChars[(b[i] & 0xf0) >> 4]);
hex.append(__hexChars[b[i] & 0x0f]);
}
return hex.toString();
}
public static byte[] fromHexString(String hex) throws NumberFormatException {
int length = hex.length();
byte[] buf = new byte[(length + 1) / 2];
boolean even = true;
byte b = 0;
int offset = 0;
if ((length % 2) == 1) even = false;
for (int i = 0; i < length; i++) {
char c = hex.charAt(i);
int nibble;
if ((c >= '0') && (c <= '9'))
nibble = c - '0';
else if ((c >= 'A') && (c <= 'F'))
nibble = c - 'A' + 0x0A;
else if ((c >= 'a') && (c <= 'f'))
nibble = c - 'a' + 0x0A;
else
throw new NumberFormatException("Invalid hex digit '" + c + "'.");
if (even) {
b = (byte) (nibble << 4);
}
else {
b += (byte) nibble;
buf[offset++] = b;
}
even = !even;
}
return buf;
}
public static String toDetailedHexString(byte[] b, int length) {
StringBuffer sb = new StringBuffer(5 * length);
int lines = (length >>> 4) + 1;
for (int i = 0; i < lines; i++) {
sb.append(__hexChars[(i >>> 4 & 0xf0) >> 4]);
sb.append(__hexChars[i >>> 4 & 0x0f]);
sb.append(__hexChars[(i << 4 & 0xf0) >> 4]);
sb.append(__hexChars[i << 4 & 0x0f]);
sb.append(' ');
int n = (i == lines - 1) ? length & 0xf : 16;
for (int j = 0; j < 16; j++) {
if (j < n) {
int c = b[i * 16 + j];
sb.append(__hexChars[(c & 0xf0) >> 4]);
sb.append(__hexChars[c & 0x0f]);
sb.append(' ');
}
else
sb.append(" ");
}
for (int j = 0; j < n; j++) {
int c = b[i * 16 + j] & 0xff;
if (c > 0x1f && c < 0x7f)
sb.append((char) c);
else
sb.append('.');
}
sb.append('\r');
sb.append('\n');
}
return sb.toString();
}
}