2013-11-20 32 views
0

我的程序发送从C#压缩数据到Java。在C#中,压缩数据从DotNetZip的Ionic.Zlib.GZipStream.CompressBuffer方法返回为byte []。该字节[]用于构造从C#发送的MemoryStream。发送从C#的无符号字节,再次接收符号字节在Java中

在Java中,流由GZIPInputStream.read方法使用,并写入另一个字节[],最终用于重建原始未压缩数据(现在为文本,但最终会成为图像)。在我的测试中,我发现对于包含非常大数字的数据集,我没有获取所有数据,这使我了解了已签名类型和未签名类型之间的区别。从我的谷歌搜索每个人似乎都建议转换为在Java端诠释,这样的信息可以被正确检索,但据我所知,是使用一个int []在GZIPInputStream合适流的建设没有这样的方式。我试图(愚蠢)在C#中将字节转换为sbyte,但MemoryStream不需要sbyte []来构建。

我该怎么办?看来我是S.O.L.我正在积极研究这个,但我想我也会问Stack。

作为参考,这里是从我有关同一个项目的早期帖子。我设法通过在该职位的问题要解决:Sending gzipped data over a network from C# to Java

编辑:为了澄清,我提到,数据仅仅是文字,但它没有工作了非常大的数字。这些数字由C#从Access读取(数字字段为文本字段),作为二进制压缩数据发送,然后在Java中重构为文本。

回答

1

你能帮助澄清。你提到原始的,未压缩的数据是文本(现在),但后来你提到它不适用于非常大的数字。没有更多的上下文,很难提供帮助。

我认为这将是值得多看基本数据类型,看看你的其他问题,我认为这是让你感到困惑的事情。

字节是二进制数据的基本货币单位。它是8位,可以有256个不同的值......几乎所有处理二进制数据的函数都会处理bytes [](例如gzip compress或uncompress)。

char是单个文本字符。在java和c#中,它是两个字节,它代表一个unicode字符 - 基本上每个字母表中的字母都是可以想到的(在U + 0000到U + FFFF范围内)。

如果你想写一个字符串到一个二进制文件(压缩它或通过网络),你需要选择如何编码该字符串。仔细查看一下关于字符串编码的一些信息。 http://www.joelonsoftware.com/articles/Unicode.html。你的其他代码示例掩盖了一些细节,但我认为这是值得明确的,这将有助于澄清你的理解。

最后,int在两种语言中都是4个字节(或32位),但这些字节的顺序又是一个选择(endian)。

希望有帮助。

+0

是的,这有很大帮助。谢谢。我正在寻找你发布的链接,我也编辑了我的原始帖子,以澄清我的意思。 – Fam

相关问题