2011-12-15 208 views
3

image是一個圖像文件的字符串。C#和Java之間的Base64差異

我有一些代碼在C#如下:

Convert.ToBase64String(image);

和代碼在Java中如下: org.apache.commons.codec.binary.Base64.encodeBase64(image.getBytes())

的結果是不同的。

有人說,它是因爲

  • Java字節:-128〜127

  • C#字節:0至255

但我怎麼能解決這個問題?我如何在Java中實現C#的Convert.ToBase64String()? 我需要通過使用Java在C#中獲得相同的結果。

+1

你在說'圖像'是一個字符串。但`Convert.ToBase64String`不接受'字符串',只接受'byte []`。 – CodesInChaos 2011-12-15 10:24:53

+1

你能說明你如何將圖像數據導入字符串嗎?請用這兩種語言。 – Stephan 2011-12-15 10:33:04

回答

3

你的base64編碼字符串?你想要做什麼?您首先需要將字符串轉換爲一系列字節,然後選擇一種編碼,如UTF-8或UTF-16。

我的猜測是,你成功地在兩側使用不同的編碼。 Java的String.GetBytes()使用默認字符集(可能在西方Windows版本上類似Latin1)。對於C#,您沒有發佈相關代碼。

爲了解決這個問題,選擇一個編碼,並明確地使用它的兩側。我建議使用UTF-8
在Java端,你應該用正確的方法進行編碼,這樣你就不會用「修訂的UTF-8」結束了,但因爲我不是一個Java程序員,我不知道是哪個方法輸出修改UTF -8。我想認爲它只會發生,如果你濫用一些內部的序列化方法。

簽名與無符號字節在這裏不應該相關。中間字節緩衝區將不同,但原始字符串和base64字符串應該在兩邊都是相同的。

5

首先,你需要認識到,一個字節存儲256個值其是否帶符號。如果你想從一個符號字節(這是Java支持)獲得的無符號值,可以使用& 0xFF

例如

byte[] bytes = { 0, 127, -128, -1}; 
for(byte b: bytes) { 
    int unsigned = b & 0xFF; 
    System.out.println(unsigned); 
} 

打印

0 
127 
128 
255 

答案很簡單,你不需要擁有相同的價值觀一個byte []。 ;)