2014-01-08 3 views
0

.net 웹 서비스에서 압축 된 문자열이 나타납니다. 일식에서 나는 찌르는 것을 감압하고 싶다.이클립스에서 문자열 압축 해제

웹 서비스에서 문자열 압축 :

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;   
    } 
} 
} 

압축 해제 :

안드로이드 사용하여 비동기에서

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); 
} 

웹 서비스 응답을

로그 캣 : 나는 압축 및 압축 해제를 구현하기 위해 시작하기 전에 내 웹 서비스 및 응답했다

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 

. 어떤 도움을 주시면 감사하겠습니다. 당신이 나를 물질적으로 가리킬 수 있다고해도 나는 읽을 수 있습니다. 1

편집 후 안드로이드에 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;   
     } 
    } 
} 

압축 해제를 안드로이드에서 : 압축 해제 아직도 바쁘다. 바이트

콘텐츠 [] 압축 후 웹 서비스 측 [1,97,0,0,31,139 ...]] 감압 전에 로이드 측 바이트

콘텐츠 [123,34,103,101,116, 65, ...]

웹 서비스 쪽에서 압축을 올바르게하고 있는지 알고 싶습니까? 안드로이드 측에서받은 바이트 []의 내용을 변경해야합니까?

첫 번째는 당신이 C#에서 기본 64에서 데이터를 인코딩하는하지만 적어도 당신이 게시 한 코드에서 자바를 디코딩하지 않는 것입니다 :

+0

음, 수는 엔디안에 문제가 존재한다 : 당신이 자바에있는 데이터의 첫 번째 4 바이트를 읽으면 C#에서보다 동일? 웹 서비스에서 – Narkha

+0

압축 된 문자열 : { "getAllProjectsByIDResult": "AWEAAB + LCAAAAAAABADsvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee ++ 997o7nU4n99"} – user3074196

+0

일식에서 수신 된 문자열 { "getAllProjectsByIDResult": "AWEAAB + LCAAAAAAABADsvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee ++ 997o7nU4n99"} 그냥 바이트 배열을 쓴 – user3074196

답변

0

나는 두 가지 문제를 참조하십시오.

두 번째는 압축 된 데이터와 압축 된 데이터의 길이가 포함 된 byte[]의 압축을 풀고 오류가 발생하는 정상적인 데이터입니다. 여기

당신은 당신이하려고하는 것을의 예를 가지고 : https://stackoverflow.com/a/18606270/1587302

을 그리고 거기에 내가 문제가 발생할 수 있는지 확인하지 오전 또 다른 한가지 : C#에서 당신이 GZipStream으로 압축하는, ZLIB를 사용하지 않습니다 ; 자바에서 zlib를 사용하는 Inflater로 압축 해제합니다. 내가 그것이 정말로 문제인지 모르겠다 고 말했기 때문에 양쪽에서 같은 것을 사용하는 것이 좋다. C# DeflateStream에서 zlib을 사용하고 자바에서 GZIPInputStream은 gzip을 사용한다. 을 수정하십시오 : user3074196이 자신의 의견임을 확인하는 것이 문제이기도합니다.

응답 한

내가 문제가 당신이 프로토콜 HTTP의 데이터와 INTERFIERE 바이너리 데이터를 전송하는 것입니다 생각 편집 할 수 있습니다.

첫 번째는 첫 번째 버전에서와 같이,베이스 64로 인코딩 된 문자열을 보내 자바를 디코딩이다 : 나는 두 가지 솔루션을 생각할 수 있습니다.

두번째 stream request을 사용하여 이진 데이터를 전송한다.

+0

게시 한 링크마다 변경했습니다. 이제 새로운 오류가 발생합니다 : IOException : java.util.zip.GZIPInputStream에서 알 수없는 형식 (매직 번호 eb53). (GZIPInputStream.java:101) – user3074196

+0

내 대답의 las parragraph를보세요. 주석으로 확인하십시오. 그래서, 나는 C# DeflateStream 대신에 GZipStream을 사용할 것이다. – Narkha

+0

DeflateStream을 사용하여 작동합니까? – Narkha