【问题标题】:Sending unsigned bytes from C#, being received as signed bytes in Java从 C# 发送无符号字节,在 Java 中作为有符号字节接收
【发布时间】:2013-12-05 03:12:53
【问题描述】:

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

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

我能做什么?看来我是S.O.L。我正在积极研究这个,但我想我也会在 Stack 上提问。

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

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

【问题讨论】:

    标签: c# java compression unsigned signed


    【解决方案1】:

    你能帮忙澄清一下吗?您提到原始的未压缩数据是文本(目前),但后来您提到它不适用于非常大的数字。如果没有更多上下文,就很难提供帮助。

    我认为值得多研究基本数据类型,研究您的其他问题,我认为这对您来说很困惑。

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

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

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

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

    希望有帮助。

    【讨论】:

    • 是的,它有很大帮助。谢谢你。我正在查看您发布的链接,并且我还编辑了我的原始帖子以澄清我的意思。
    猜你喜欢
    • 2013-07-19
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 2017-10-01
    • 2014-12-06
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    相关资源
    最近更新 更多