2011-11-27 30 views
0

我是法國人,所以,我對我的英語對不起......的Base64編碼的Android PHP的解碼使錯誤

我開發一個Android應用程序,其與PHP REST服務進行通信。所以,當我嘗試將一個圖像文件編碼爲Base64的是這樣的:

InputStream fileInputStream = context.getContentResolver().openInputStream(uri); 
BufferedInputStream in = new BufferedInputStream(fileInputStream); 
StringWriter out = new StringWriter(); 
int b; 
while ((b = in.read()) != -1) 
    out.write(b); 
out.flush(); 
out.close(); 
in.close(); 
String encoded = new String(android.util.Base64.encode(out.toString() 
      .getBytes(), android.util.Base64.DEFAULT)); 

在服務器端,我做:

$data=base64_decode(chunk_split($base64BinaryData)); 

的結果是,我的圖像文件被破壞!

信息:該圖像是由仿真器模式的意圖android.provider.MediaStore.ACTION_IMAGE_CAPTURE活動(AVD 5554)

我已經閱讀了大量關於類似問題的討論,但沒有解決我的錯誤做。

感謝您的幫助

問候,

回答

0

我假設:

out.toString().getBytes() 

是錯誤的。 「out」是什麼類型?如果這是一個圖像,那麼您需要獲取圖像的原始字節,而不是該對象的字符串表示的字節。

+0

out是接收BufferedInputStream讀取圖像文件的StringWriter(我已經用完整的代碼更改了我的原生帖子) –

+0

您不應該寫入StringWriter,而是使用字節流,這意味着當您寫入到一個StringWriter它會嘗試在默認編碼中對其進行解碼,並且當檢索字節時,它將使用默認編碼再次對其進行編碼,但是這次它已經刪除了它無法理解的「字節」。您需要獲取沒有StringWriter的字節數組。 – jishi

+0

非常感謝,沒錯!使用ByteArrayOutputStream而不是StringWriter來解決我的問題。 –

0

你能剛落chunk_split?

另外,你可以散列兩個二進制文件?也許使用sha1,看看它們是否真的不同?

+0

實際上,哈希完全相同!好的,我認爲Android模擬器的替代圖片不可用(僅適用於Android應用程序)。我必須在真實設備上試用我的應用,然後我會告訴你這個問題。感謝您的非常好的澄清。 –