java - 如何对实际上是 int[] 的无符号字节数组进行 base64 编码

标签 java c# base64 bytearray sha1

我在 C#JAVA 之间进行通信时遇到问题。我必须在我的程序中使用 JAVA 中的 SHA1 散列一个值。问题是,在 JAVA 中计算散列会产生一个 byte[](C# 也是如此,但是:) byte JAVA 中的类型是已签名,而在 C# 中是未签名。所以我必须摆脱 JAVA 中的额外位(不能触及 C# 端)。这是我正在做的:

private static int[] Hash(byte[] plainBytes, byte[] saltBytes)
        throws NoSuchAlgorithmException, UnsupportedEncodingException {
    byte[] sourceBytes = new byte[plainBytes.length + saltBytes.length];
    for (int i = 0, il = plainBytes.length; i < il; i++)
        sourceBytes[i] = plainBytes[i];
    for (int i = 0, il = saltBytes.length, pil = plainBytes.length; i < il; i++)
        sourceBytes[pil + i] = saltBytes[i];
    MessageDigest digest = MessageDigest.getInstance("SHA-1");
    digest.reset();
    byte[] resultBytes = digest.digest(sourceBytes);
    int[] result = new int[resultBytes.length];
    for (int i = 0, il = resultBytes.length; i < il; i++)
        result[i] = ((int) resultBytes[i]) & 255;
    return result;
}

它给了我正确的数组。但是,问题是 base64result 进行编码。我怎样才能做到这一点而不会再次陷入 signed byte 陷阱?我的意思是如何完成这个片段:

var resultArray = Hash(someSource, someSalt);
var resultBase64EncodedString = HOW_TO_BASE64_ENCODE_HERE(resultArray);

提前致谢。

最佳答案

用 Base64 编码你的 resultBytes 数组

String base64EncodedString = DatatypeConverter.printBase64Binary(resultBytes);

应该为您提供与在 C# 中使用相同的 base64 编码字符串

SHA1 sha1 = SHA1.Create();
byte[] currentHash = new byte[0];
currentHash = sha1.ComputeHash(sourceBytes);
String base64EncodedString = Convert.ToBase64String(currentHash);

关于java - 如何对实际上是 int[] 的无符号字节数组进行 base64 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30978436/

相关文章:

java - 返回 MembersInjectors.injectMembers 时出错

java - 执行时间 : Boost Multi-precision vs Java BigInteger

java - 如何使用 if 语句在构造函数中声明最终字符串?

c# - XNA Vector3 到 Vector3D

c# - 在 C# 中将 SQL 查询中的项目添加到列表框

java - 通过 POST 将 ZIP 文件发送到 Base64 中的服务器

java - java中通过名称获取字段值

c# - CultureInfo.CurrentCulture 给我错误的文化

hash - 什么样的哈希返回小写和大写字符?

python - 将 base64 字符串解码为十进制字符串