I’m posting this code snippet here because a) it took me a while to figure it out and b) I couldn’t find anything like it out on the big bad internet.
Problem: convert a 24-byte hex array (unsigned bytes) to a string, and back again. A byte can range from values 0 to 255, or 0x00 to 0xff. Seems simple, except Java treats its native ‘byte’ type as a signed integer, which means values range from -128 to 128. So 0xFD as a signed byte is ‘-3’, while it is ‘253’ as unsigned. And… each byte must be represented by two digits.
Solution:
Convert a byte array to a string:
private String convertByteArrayToHexString(byte[] buf) {
StringBuffer sbuff = new StringBuffer();
for (int i=0; i<buf .length; i++) {
int b = buf[i];
if (b < 0) b = b & 0xFF;
if (b<16) sbuff.append("0");
sbuff.append(Integer.toHexString(b).toUpperCase());
}
return sbuff.toString();
}
And back to a byte array again:
private byte[] convertHexStringtoByteArray(String hex) {
java.util.Vector res = new java.util.Vector();
String part;
int pos = 0; //position in hex string
final int len = 2; //always get 2 items.
while (pos < hex.length()) {
part = hex.substring(pos,pos+len);
pos += len;
int byteVal = Integer.parseInt(part,16);
res.add(new Byte((byte)byteVal));
}
if (res.size() > 0) {
byte[] b = new byte[res.size()];
for (int i=0; i<res .size(); i++) {
Byte a = (Byte)res.elementAt(i);
b[i] = a.byteValue();
}
return b;
} else {
return null;
}
}
There ya have it.