如何在java中以无符号方式将字节数组转换为Base 64字符串?

时间:2017-07-31 11:35:46

标签: java c# base64

我很难在C#和Java

中获得相同的Base64字符串

我希望Java在转换为Base64时将字节视为无符号字符。

这是我的C#代码

private static void Main(string[] args)
{
    long baseTimeStamp = 1501492600;
    byte[] bytes = BitConverter.GetBytes(baseTimeStamp * 114);

    for (int i = 0; i < bytes.Length; i++)
    {
        bytes[i] = (byte)(bytes[i] >> 2);
    }

    string base64 = Convert.ToBase64String(bytes);

    Console.WriteLine(base64);
}

在Java中,我希望为相同的long值获得相同的Base64

这是代码

public static void main(String[] args) {
    long myLong = 1501492600;

    byte[] bytes = longToBytes(myLong);

    for(int i = 0; i < bytes.length / 2; i++)
    {
        int temp = bytes[i];
        bytes[i] = bytes[bytes.length - i - 1];
        bytes[bytes.length - i - 1] = (byte) temp;

        bytes[i] = (byte)((bytes[i] >> 2));
    }

    System.out.println(DatatypeConverter.printBase64Binary(bytes));
}

private static byte[] longToBytes(long x) {
    ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
    buffer.putLong(x);
    return buffer.array();
}

我尝试了注释方式和DatatypeConverter方式,但我获得了不同的String值。是否有标准的JDK方式,或者我应该编写自己的base64方法来将字节视为无符号的方法吗?

1 个答案:

答案 0 :(得分:1)

Base64转换位。它不知道或不关心您是否将字节视为有符号或无符号。如果你得到不同的值,那么问题出在其他地方。

但是,由于您正在进行位移,因此您需要使用零填充版本>>>而不是符号扩展>>。这可能是你问题的根源。

DatatypeConverter仍然是最简单的方法。