有一些SO quetions但没有帮助我。我想将byte[]
从org.apache.commons.codec.digest.HmacUtils
转换为String。这段代码会产生一些奇怪的输出:
final String value = "value";
final String key = "key";
byte[] bytes = HmacUtils.hmacSha1(key, value);
String s = new String(bytes);
我做错了什么?
答案 0 :(得分:2)
尝试使用:
String st = HmacUtils.hmacSha1Hex(key, value);
答案 1 :(得分:1)
首先,hmacSha1
的结果会产生一个摘要,而不是一个明确的String
。此外,您可能必须指定编码格式,例如
String s = new String(bytes, "US-ASCII");
或
String s = new String(bytes, "UTF-8");
答案 2 :(得分:1)
对于更通用的解决方案,如果您没有HmacUtils可用:
// Prepare a buffer for the string
StringBuilder builder = new StringBuilder(bytes.length*2);
// Iterate through all bytes in the array
for(byte b : bytes) {
// Convert them into a hex string
builder.append(String.format("%02x",b));
// builder.append(String.format("%02x",b).toUpperCase()); // for upper case characters
}
// Done
String s = builder.toString();
解释你的问题: 您正在使用哈希函数。所以哈希通常是一个字节数组,看起来应该是随机的。
如果使用新的String(字节),则尝试从这些字节创建字符串。但Java会尝试将字节转换为字符。
例如:字节65(十六进制0x41)成为字母' A'。 66(十六进制0x42)字母' B'等等。某些数字无法转换为可读字符。这就是为什么你会看到奇怪的人物,比如'�'。
所以新的String(新字节[] {0x41,0x42,0x43})将成为' ABC'。
您还需要其他内容:您希望将每个字节转换为2位十六进制字符串(并附加这些字符串)。
问候!
答案 3 :(得分:0)
您可能需要具有编码格式。点击此链接。