java - getBytes() 在 Windows (Java 9) 下按预期工作,但在 Linux 下不起作用

标签 java linux encoding base64

方法 getBytes() 在 Windows (Java9) 下按预期工作,但在 Linux 下不起作用。两个系统上的Characterset() => UTF-8。 JVM版本=>Java 9(我在Linux下测试了open jvm和oracle jvm)
代码:

public static String createSign(String uri, String apiSecret) throws UnsupportedEncodingException{
    byte[] signBytes = calculateSignBytes(uri, apiSecret);
    return bytesToHexString(signBytes);
}

private static byte[] calculateSignBytes(String uri, String secret) throws UnsupportedEncodingException {

    try {
        Mac mac = Mac.getInstance(ALGORITHM);
        SecretKeySpec secretKeySpec = new SecretKeySpec(secret.getBytes(), ALGORITHM);
        mac.init(secretKeySpec);
        return mac.doFinal(uri.getBytes());
    } catch (NoSuchAlgorithmException | InvalidKeyException e) {
        throw new RuntimeException(e);
    }
}

private static String bytesToHexString(byte[] bytes){
    StringBuilder stringBuilder = new StringBuilder();
    for (byte b : bytes) {
        stringBuilder.append(String.format("%02x", b));
    }
    return stringBuilder.toString();
}

Windows和Linux下相同。我还在 Windows 下测试了编译和导出可执行 JAR,并在 Linux 上测试了它,除了上面的代码之外,所有功能都运行良好。

最佳答案

请记住始终使用字符集,这样可以避免意外结果。

new SecretKeySpec(secret.getBytes ( Charsets.UTF_8 ), ALGORITHM)

关于java - getBytes() 在 Windows (Java 9) 下按预期工作,但在 Linux 下不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58381977/

相关文章:

java - Android SQLite 按数字字段选择

java - 使用预先签名的URL将文件放入S3

java - 通过 Espresso 运行单元测试时,由于 'java.lang.ClassNotFoundException' 错误,仪器运行失败

java - 从 java 文件运行 jar 文件

linux - 如何解析 zsh/shell 脚本中的问号作为参数?

python-3.x - '[Errno 26] 文本文件忙 : '/home/*****/.wdm/drivers/chromedriver/83.0.4103.39/linux64/chromedriver' '

c - struct msghdr 的 msg_name 不指向 linux 安全模块的 socket_recvmsg 中的 struct sockaddr_in

c# - 这是 base40 吗?如果是,我如何在 C# 中对其进行解码?

java - 使用 contentType application/json 发布正文后,Grails 未以 UTF-8 进行编码

mysql - SQLJocky : Incorrect encoding of received text