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

Posted

技术标签:

【中文标题】如何对实际上是 int[] 的无符号字节数组进行 base64 编码【英文标题】:how to base64 encode an unsigned byte array which is actually a int[] 【发布时间】:2015-09-07 19:33:51 【问题描述】:

我在 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;

它给了我正确的数组。但是,问题在于 base64 编码 result。我怎样才能做到这一点而不会再次陷入signed byte 陷阱?我的意思是如何完成这个sn-p:

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

提前致谢。

【问题讨论】:

你不是说byte在C#中未签名,在Java中签名吗? 是的 :) 更正问题 字节值 0xff 在 java 中是 -1,在 C# 中是 255。但它只是整数表示。内部表示没有区别。 0xff 就是 0xff。 【参考方案1】:

使用 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);

【讨论】:

以上是关于如何对实际上是 int[] 的无符号字节数组进行 base64 编码的主要内容,如果未能解决你的问题,请参考以下文章

如何在c中的无符号字符中移动字节

如何创建一个紧密打包的无符号字节统一缓冲区?

C中的无符号整数在java中的处理

Java不提供无符号整数类型?谢谢

如何从 Java 中的无符号字节中获取浮点数?

如何从 Java 中的 BigInteger 获取无符号字节数组?