Java中的压缩数组字节来自.NET Web服务

3

1 - 我们有一个从webservice. NET 2008 (vb)返回字节数组的方法,这个字节数组实际上是使用System.IO.Compression GZipStream类压缩的字符串“Hola Mundo”(英文中的“Hello World”)。

2 - 这个方法返回压缩后的字符串“Hola Mundo”,这就是webservice返回的内容:

<base64Binary>
H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Ir5dlVn6xXo5q/4f0m5DIgoAAAA=
</base64Binary>

3 - 如果我在Visual Basic.NET的Windows应用程序中运行此方法进行测试,则返回以下字符串,并使用另一个函数解压缩,它会将“Hola Mundo”带给我....

4 - 在Android(Eclipse)上,我成功发出请求并获得了先前的字符串...但不知道如何解压缩并显示“Hola Mundo”...

5 - 我尝试了网上的几个代码,但都没有起作用。

有人了解这方面的知识吗?非常感谢您的帮助。

问候。


3
所以你已经将一个包含10个字符的字符串压缩到只有172个字符。很棒! - Marc Gravell
嗨,Marc Gravell,这只是一个简单的例子,我实际上要压缩大约3 MB的文本。 - seba123neo
我得承认,这有点半开玩笑的意味 ;p - Marc Gravell
4个回答

3
如果Android支持java.util.zip.GZIPInputStream,那就是你想要的。
例如:
byte[] bytes = getBytesFromWebService();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
GZIPInputStream gzip = new GZIPInputStream(bais);
try {
  InputStreamReader reader = new InputStreamReader(gzip, "UTF-8");
  try {
    String firstLine = new BufferedReader(reader).readLine();
    ...
  } finally {
    reader.close();
  }
} finally {
  gzip.close();
}

你好,你的代码在“GZIPInputStream gzip = new GZIPInputStream(bais);”这一行抛出了错误:java.io.IOException: 未知格式。 - seba123neo
@seba123neo:那就意味着您没有正确检索字节数组。我建议您在调试器中检查字节。 - Jon Skeet
你代码中的这一行 "byte[] bytes = getBytesFromWebService();" 我已经改成了 "byte [] bytes = Result.GetBytes();",其中变量 "Result" 包含字符串 "H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Ir5dlVn6xXo5q/4f0m5DIgoAAAA="。 - seba123neo
@seba123neo:嗯,那不对,因为它是base64编码的。你需要先对数据进行base64解码。 - Jon Skeet
非常感谢Jon,问题已经解决了,我所做的是:1- 使用我在互联网上找到的一个类对字符串进行解码。 2- 链接是http://iharder.sourceforge.net/current/java/base64/ 非常快速,不需要使用gzip进行解压缩,当它检测到gzip时,该类会自动解压缩... 有人知道比这更快的类吗?问候和感谢大家的时间。 - seba123neo

1

Android自带的没有Base-64转换功能。我使用了Bouncy Castle Java Cryptographic Library中提供的转换方法。 Bouncy Castle

此外,你也可以在ksoap2-android库中找到它们。


1

1

我无法评论Android,但你只需要:

  • 反转base-64
  • 反转gzip
  • 解码字符串(可能是UTF8格式)

在C#中,可以这样实现:

string base64 = "H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Ir5dlVn6xXo5q/4f0m5DIgoAAAA=";
byte[] blob = Convert.FromBase64String(base64);
string orig;
using (var ms = new MemoryStream(blob))
using (var gzip = new GZipStream(ms, CompressionMode.Decompress))
using (var reader = new StreamReader(gzip))
{
    orig = reader.ReadToEnd(); // Hola Mundo
}

是的,是的,那正是我需要的,但是要用Android Java代码。 - seba123neo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接