2017-07-31 48 views
0

我努力在C#和Java中獲得相同的Base64字符串如何在java中以無符號方式將字節數組轉換爲Base 64字符串?

我希望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中,我想獲得相同的Base64相同long

下面的代碼

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的方式,但我得到不同的字符串值。有沒有標準的JDK方式,還是應該編寫我自己的base64方法來將字節視爲未簽名的方式?

+0

Base64不關心「signed」或「unsigned」。我想問題是你正在轉換不同的字節數組,所以你可能會在'longToBytes'中找到問題的根源 - 不管做什麼。 –

+0

由於C#中的'''是邏輯移位,因此您需要執行'bytes [i] =(byte)((bytes [i]&0xff)>> 2)'以便對Java執行相同操作。 – saka1029

+0

我試過我們的,但它只適用於當我分配給一個int時,當我分配給一個字節,我再次失去無符號行爲 – Carmine

回答

0

Base64轉換位。它不知道或關心您是否將字節視爲已簽名或未簽名。如果你得到不同的價值觀,這個問題就在別的地方。

但是,由於您正在進行位移,因此您需要使用零填充版本>>>而不是標記擴展>>。這可能是你問題的根源。

DatatypeConverter仍然是最簡單的方法。

+0

你是對的,轉換是正確的,問題在於轉移,儘管我的情況在'>>'和'>>>'沒有區別。 – Carmine

相關問題