如何在Java中将字节[]转换为字符串?

如何在Java中将字节[]转换为字符串?,java,Java,有一些问题,但没有帮助我。我想将org.apache.commons.codec.digest.HmacUtils中的byte[]转换为字符串。这段代码会产生一些奇怪的输出: final String value = "value"; final String key = "key"; byte[] bytes = HmacUtils.hmacSha1(key, value); String s = new String(bytes); 我做错了什么?首先,hmacSha1的结果将生成摘要,而

有一些问题,但没有帮助我。我想将
org.apache.commons.codec.digest.HmacUtils
中的
byte[]
转换为字符串。这段代码会产生一些奇怪的输出:

final String value = "value";
final String key = "key";
byte[] bytes = HmacUtils.hmacSha1(key, value);
String s = new String(bytes);

我做错了什么?

首先,
hmacSha1
的结果将生成摘要,而不是清晰的
字符串。此外,例如,您可能必须指定编码格式

String s = new String(bytes, "US-ASCII");


首先,
hmacSha1
的结果将生成摘要,而不是清晰的
字符串。此外,例如,您可能必须指定编码格式

String s = new String(bytes, "US-ASCII");


您可能需要有一个编码格式。在这里查看此链接


您可能需要一种编码格式。在这里查看此链接

尝试使用:

String st = HmacUtils.hmacSha1Hex(key, value);
尝试使用:

String st = HmacUtils.hmacSha1Hex(key, value);

对于更通用的解决方案,如果您没有可用的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();
要解释您的问题: 您正在使用哈希函数。所以散列通常是一个字节数组,看起来很随机

如果使用新字符串(字节),则尝试从这些字节创建字符串。但是Java将尝试将字节转换为字符

例如:字节65(十六进制0x41)变成字母“A”。66(十六进制0x42)字母“B”等。某些数字无法转换为可读字符。这就是为什么你会看到奇怪的角色,比如�'.

因此,新字符串(新字节[]{0x41,0x42,0x43})将变为“ABC”

您还需要其他东西:您需要将每个字节转换为2位十六进制字符串(并附加这些字符串)


你好

要获得更通用的解决方案,如果您没有可用的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();
要解释您的问题: 您正在使用哈希函数。所以散列通常是一个字节数组,看起来很随机

如果使用新字符串(字节),则尝试从这些字节创建字符串。但是Java将尝试将字节转换为字符

例如:字节65(十六进制0x41)变成字母“A”。66(十六进制0x42)字母“B”等。某些数字无法转换为可读字符。这就是为什么你会看到奇怪的角色,比如�'.

因此,新字符串(新字节[]{0x41,0x42,0x43})将变为“ABC”

您还需要其他东西:您需要将每个字节转换为2位十六进制字符串(并附加这些字符串)


你好

通常,以十六进制显示sha1哈希。具有十六进制编码器。可能相关,可能重复:否则哈希函数的结果“随机二进制”将不是有用的文本/字符串值。通常,您以十六进制显示sha1哈希。有一个十六进制编码器。可能是相关的,可能是重复的:否则哈希函数的结果“随机二进制”将不是有用的文本/字符串值。好吧,我仍然得到一个奇怪的输出(“WD:L#P�F8�]D�F�/�3”)与此测试应用程序不符-。@user1315357混淆的是问题/预期输出没有明确指定。好吧,我仍然得到一个奇怪的输出(“WD:L#P�F8�]D�F�/�3”)与此测试应用程序不对应-。@user1315357混淆之处在于未明确指定问题/预期输出。