从C#发送无符号字节,在Java中作为带符号字节接收

时间:2013-11-20 21:40:10

标签: c# java compression unsigned signed

我的程序是将压缩数据从C#发送到Java。在C#中,压缩数据作为byte []从DotNetZip的Ionic.Zlib.GZipStream.CompressBuffer方法返回。此byte []用于构造从C#发送的MemoryStream。

在Java中,流由GZIPInputStream.read方法使用并写入另一个byte [],最后用于重建原始的未压缩数据(现在是文本,但最终将成为图像) 。在我的测试中,我发现对于包含非常大数字的数据集,我没有获得所有数据,这使我了解了有符号和无符号类型之间的区别。从我的谷歌搜索,每个人似乎都建议在Java端转换为int,以便可以正确检索信息,但据我所知,在为GZIPInputStream构造合适的流时,没有这种方法可以使用int [] 。我试图(愚蠢地)在C#中从byte转换为sbyte,但是MemoryStream不会使用sbyte []进行构造。

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

作为参考,这是我之前关于同一项目的帖子。我设法解决了帖子中的问题:Sending gzipped data over a network from C# to Java

编辑:为了澄清,我提到数据只是文本,但它不适用于非常大的数字。这些数字由来自Access的C#作为文本读取(数字字段是文本字段),作为二进制压缩数据发送,然后在Java中重新构建为文本。

1 个答案:

答案 0 :(得分:1)

你能帮忙解释一下吗?你提到原始的,未压缩的数据是文本(现在),但是后来你提到它不适用于非常大的数字。没有更多的背景,很难提供帮助。

我认为更值得研究一下基本数据类型,看看你的另一个问题,我觉得这对你来说很困惑。

byte是二进制数据的基本货币单位。它是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)。

希望有所帮助。