package com.netease.nim.uikit.common.util.string;
import java.io.IOException;
import java.io.StringReader;
public class HexDump {
class HexTablifier {
private int m_row = 8;
private String m_pre = "";
private String m_post = "\n";
public HexTablifier() {
}
public HexTablifier(int row) {
this(row, "", "\n");
}
public HexTablifier(int row, String pre) {
this(row, pre, "\n");
}
public HexTablifier(int row, String pre, String post) {
m_row = row;
m_pre = pre;
m_post = post;
}
public String format(String hex) {
StringReader reader = new StringReader(hex);
StringBuilder builder = new StringBuilder(hex.length() * 2);
try {
while (getHexLine(builder, reader)) {
}
} catch (IOException e) {
// 不应该有异常出现。
}
return builder.toString();
}
private boolean getHexLine(StringBuilder builder, StringReader reader)
throws IOException {
StringBuilder lineBuilder = new StringBuilder();
boolean result = true;
for (int i = 0; i < m_row; i++) {
result = getHexByte(lineBuilder, reader);
if (result == false)
break;
}
if (lineBuilder.length() > 0) {
builder.append(m_pre);
builder.append(lineBuilder);
builder.append(m_post);
}
return result;
}
private boolean getHexByte(StringBuilder builder, StringReader reader)
throws IOException {
char[] hexByte = new char[4];
int bytesRead = reader.read(hexByte);
if (bytesRead == -1)
return false;
builder.append(hexByte, 0, bytesRead);
builder.append(" ");
return bytesRead == 4;
}
}
private static final char m_hexCodes[] = { '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
private static final int m_shifts[] = { 60, 56, 52, 48, 44, 40, 36, 32, 28,
24, 20, 16, 12, 8, 4, 0 };
public static String tablify(byte[] bytes) {
return (new HexDump()).new HexTablifier().format(HexDump.toHex(bytes));
}
public static String tablify(byte[] bytes, int row) {
return (new HexDump()).new HexTablifier(row).format(HexDump
.toHex(bytes));
}
public static String tablify(byte[] bytes, int row, String pre) {
return (new HexDump()).new HexTablifier(row, pre).format(HexDump
.toHex(bytes));
}
public static String tablify(String hex, int row, String pre, String post) {
return (new HexDump()).new HexTablifier(row, pre, post).format(hex);
}
private static String toHex(final long value, final int digitNum) {
StringBuilder result = new StringBuilder(digitNum);
for (int j = 0; j < digitNum; j++) {
int index = (int) ((value >> m_shifts[j + (16 - digitNum)]) & 15);
result.append(m_hexCodes[index]);
}
return result.toString();
}
public static String toHex(final byte value) {
return toHex(value, 2);
}
public static String toHex(final short value) {
return toHex(value, 4);
}
public static String toHex(final int value) {
return toHex(value, 8);
}
public static String toHex(final long value) {
return toHex(value, 16);
}
public static String toHex(final byte[] value) {
return toHex(value, 0, value.length);
}
public static String toHex(final byte[] value, final int offset,
final int length) {
StringBuilder retVal = new StringBuilder();
int end = offset + length;
for (int x = offset; x < end; x++)
retVal.append(toHex(value[x]));
return retVal.toString();
}
public static byte[] restoreBytes(String hex) {
byte[] bytes = new byte[hex.length() / 2];
for (int i = 0; i < bytes.length; ++i) {
int c1 = charToNumber(hex.charAt(2 * i));
int c2 = charToNumber(hex.charAt(2 * i + 1));
if (c1 == -1 || c2 == -1) {
return null;
}
bytes[i] = (byte) ((c1 << 4) + c2);
}
return bytes;
}
private static int charToNumber(char c) {
if (c >= '0' && c <= '9') {
return c - '0';
} else if (c >= 'a' && c <= 'f') {
return c - 'a' + 0xa;
} else if (c >= 'A' && c <= 'F') {
return c - 'A' + 0xA;
} else {
return -1;
}
}
}