2014-01-08 29 views
0

我從我的.net Web服務中獲取壓縮的字符串。在日食中,我想解壓縮刺。減少日食中的字符串

壓縮在Web服務中的字符串:

resultJsonString = new AsyncGetProductIdResults().execute(link).get(); 


    String temp = unZip(resultJsonString); 

異步:

class AsyncGetProductIdResults extends AsyncTask<String, Void, String> 
    { 
    @SuppressWarnings("null")  
@Override 
protected String doInBackground(String... params) 
{ 
    String url = params[0]; 
    HttpClient httpClient = new DefaultHttpClient(); 
    HttpGet httpPost = new HttpGet(url); 

    try 
    {   
     HttpResponse response = httpClient.execute(httpPost); 

     return EntityUtils.toString(response.getEntity()); 
    } 

    catch (ClientProtocolException e) 
    { 
     e.printStackTrace();    
    } 

    catch (IOException e) 
    {   
     e.printStackTrace();    
    } 

    return null; 
} 

@Override 
protected void onPostExecute(String idResult) 
{   
    if (idResult == null) 
    public static byte[] ZipStr(string str) 
    { 
    { 
     return;   
    } 
} 
} 

解壓縮的android:

Android中使用異步

public static string Compress(string text) 
{ 
    byte[] buffer = Encoding.UTF8.GetBytes(text); 
    MemoryStream ms = new MemoryStream(); 
    using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true)) 
    { 
     zip.Write(buffer, 0, buffer.Length); 
    } 

    ms.Position = 0; 
    MemoryStream outStream = new MemoryStream(); 

    byte[] compressed = new byte[ms.Length]; 
    ms.Read(compressed, 0, compressed.Length); 

    byte[] gzBuffer = new byte[compressed.Length + 4]; 
    System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length); 
    System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4); 
    return Convert.ToBase64String(gzBuffer); 
} 

Web服務響應

的logcat:

01-08 11:07:59.016: E/AndroidRuntime(1327): FATAL EXCEPTION: main 
01-08 11:07:59.016: E/AndroidRuntime(1327): java.lang.IllegalStateException: Could not execute method of the activity 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at android.view.View$1.onClick(View.java:3591) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at android.view.View.performClick(View.java:4084) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at android.view.View$PerformClick.run(View.java:16966) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at android.os.Handler.handleCallback(Handler.java:615) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at android.os.Handler.dispatchMessage(Handler.java:92) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at android.os.Looper.loop(Looper.java:137) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at java.lang.reflect.Method.invoke(Method.java:511) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at dalvik.system.NativeStart.main(Native Method) 
01-08 11:07:59.016: E/AndroidRuntime(1327): Caused by: java.lang.reflect.InvocationTargetException 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at java.lang.reflect.Method.invoke(Method.java:511) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at android.view.View$1.onClick(View.java:3586) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  ... 11 more 
01-08 11:07:59.016: E/AndroidRuntime(1327): Caused by: java.util.zip.DataFormatException: data error 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at java.util.zip.Inflater.inflateImpl(Native Method) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at java.util.zip.Inflater.inflate(Inflater.java:228) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at java.util.zip.Inflater.inflate(Inflater.java:205) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at com.example.testp.SecondActivity.unZip(SecondActivity.java:184) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  at com.example.testp.SecondActivity.JSONDataSync(SecondActivity.java:83) 
01-08 11:07:59.016: E/AndroidRuntime(1327):  ... 14 more 

之前,我開始實施壓縮和解壓我的Web服務和響應工作。任何幫助將不勝感激。即使你能指出我的材料,我也可以閱讀。

編輯1

申請後在Android中https://stackoverflow.com/a/21016711/1587302

public static byte[] ZipStr(string str) 
    { 
     using (MemoryStream output = new MemoryStream()) 
     { 
      using (DeflateStream gzip = 
       new DeflateStream(output, CompressionMode.Compress)) 
      { 
       using (StreamWriter writer = 
        new StreamWriter(gzip, System.Text.Encoding.UTF8)) 
       { 
        writer.Write(str); 
       } 
      } 

      return output.ToArray(); 
     } 
    } 

的AsyncTask提出的修改:

class AsyncGetProductIdResultsBytes extends AsyncTask<String, Void, byte[]> 
{ 
    @SuppressWarnings("null")  
    @Override 
    protected byte[] doInBackground(String... params) 
    { 
     String url = params[0]; 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpPost = new HttpGet(url); 

     try 
     {   
      HttpResponse response = httpClient.execute(httpPost); 

      return EntityUtils.toByteArray(response.getEntity()); 
     } 

     catch (ClientProtocolException e) 
     { 
      e.printStackTrace();    
     } 

     catch (IOException e) 
     {   
      e.printStackTrace();    
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(byte[] idResult) 
    {   
     if (idResult == null) 
     { 
      return;   
     } 
    } 
} 

解壓縮安卓還在忙着減壓。

內容字節的[]上壓縮之後web服務側:[1,97,0,0,31,139,...]

內容字節[]上減壓之前機器人側的:[123,34,103,101,116, 65,...]

只是想知道如果即時通訊在Web服務端進行壓縮嗎?當它在android端收到時byte []的內容是否應該改變?

+0

好,可能存在與字節序的一個問題:如果你在Java中讀取前四個字節的數據比C#一樣的嗎? – Narkha

+0

從web服務被壓縮的字符串:{ 「getAllProjectsByIDResult」: 「+ AWEAAB ++ LCAAAAAAABADsvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee 997o7nU4n99」} – user3074196

+0

Eclipse中的接收到的字符串{ 「getAllProjectsByIDResult」: 「+ AWEAAB ++ LCAAAAAAABADsvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee 997o7nU4n99」} – user3074196

回答

0

我看到兩個問題:

首先是要在在c#基座64編碼該數據,但還沒有解碼的java它,至少在已發佈的代碼。

第二個問題是您正在解壓縮包含壓縮數據長度和壓縮數據的byte[],這是正常的,會導致錯誤。

在這裏,你有你正在嘗試做一個例子:https://stackoverflow.com/a/18606270/1587302

而且那裏,我不知道,如果可能會導致問題的另一件事:在C#與GZipStream壓縮,誰不使用zlib ;在Java解壓與Inflater誰使用zlib。正如我所說我不確定是否有問題,但我建議在兩邊使用相同的:在C#DeflateStream使用zlib和在java中GZIPInputStream使用gzip。 編輯:作爲用戶3074196確認是他的評論這也是一個問題。

迴應編輯1

我覺得現在的問題是,你要發送與協議HTTP的數據interfiere二進制數據。我能想到的兩個解決方案:

首先是在發送base 64編碼字符串,如您第一個版本,它在Java中進行解碼。

第二種是使用stream request和傳送二進制數據。

+0

我根據你發佈的鏈接進行了修改。現在我得到一個新的錯誤:IOException:java.util.zip.GZIPInputStream上的未知格式(幻數eb53)。 (GZIPInputStream.java:101) – user3074196

+0

看看我答案的las部分:你評論確認。所以,我會用c#DeflateStream代替GZipStream。 – Narkha

+0

它使用DeflateStream工作嗎? – Narkha