gpt4 book ai didi

java - 对于在不同 JRE 版本(jre7 和 jre8)中运行的将字节转换为字符串函数的相同代码,我得到了不同的结果

转载 作者:行者123 更新时间:2023-12-01 12:43:21 27 4
gpt4 key购买 nike

我想在我们的产品中将 jre7 升级到 jre8,但出现一些错误。根本原因就是标题说的,结果不稳定。

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;


public class Digest {
/**
*
* @param args
* @throws NoSuchAlgorithmException
* @throws UnsupportedEncodingException
*/
public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException
{

String userName = "superuser";
String password = "superuser";

byte[] userNameBytes = userName.getBytes(Charset.forName("GBK"));
byte[] passwordBytes = password.getBytes(Charset.forName("GBK"));

byte[] hashedBytes = digest(userNameBytes,passwordBytes);

System.out.println(Arrays.toString(hashedBytes));

String tmp = new String(hashedBytes,Charset.forName("GBK"));
byte[] newHashedBytes = tmp.getBytes(Charset.forName("GBK"));

System.out.println(Arrays.toString(newHashedBytes));
}

public static byte[] digest(byte[] username, byte[] password) throws NoSuchAlgorithmException
{
MessageDigest md = MessageDigest.getInstance("SHA");
md.reset();
md.update(password);
md.update(username);
return md.digest();
}
}

示例代码是遗留逻辑。我的问题是如何使用解决方法来解决这个问题。

这是我的测试用例:

userNmae密码编码结果

super 用户 super 用户UTF-8已通过

super 用户 super 用户GBK失败

test62 test62 GBK 失败

test62 test62 UTF-8 失败

非常感谢。

最佳答案

从随机字节到字符串的转换可能是有损操作(取决于所使用的字符集):

String tmp = new String(hashedBytes,Charset.forName("GBK"));

无法使用所选 CharSet 进行编码的字节值将被替换(通常用“?”),因此当转换回 byte[] 时,您会得到不同的字节数组。

一般来说,永远不要使用任何字符集将二进制数据转换为字符串并返回(尽管它可能适用于某些字符集,但当您需要时,它可能会带来很多麻烦。传输数据或将其存储在数据库中等)。有些编码(例如 Base64)专门设计为可逆的最小通用字符集 (ASCII)。

编辑:这个小测试程序表明,并不是每个字符在转换中都反转为同一个字节(看看 -128 变成 63)

import java.nio.charset.Charset;
import java.util.Arrays;

public class CSTest {
public static void main(String[] argv) {
Charset cs = Charset.forName("GBK");
byte[] bytes = new byte[256];
for (int i=0; i<bytes.length; ++i)
bytes[i] = (byte) i;
System.out.println(Arrays.toString(bytes));
String s = new String(bytes, cs);
byte[] b2 = s.getBytes(cs);
System.out.println(Arrays.toString(b2));
}
}

关于java - 对于在不同 JRE 版本(jre7 和 jre8)中运行的将字节转换为字符串函数的相同代码,我得到了不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24889427/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com