【问题标题】:C# equivalent for ByteArrayOutputStream in javaC# 等效于 java 中的 ByteArrayOutputStream
【发布时间】:2014-02-27 08:04:10
【问题描述】:

我有java 代码

ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(tokenBytes);
baos.write(signedData);
byte[] finalout = baos.toByteArray();

其中 tokenBytes 和 signedData 是字节数组。在c# 我写成

 using (MemoryStream stream = new MemoryStream())
        {
            using (BinaryWriter writer = new BinaryWriter(stream))
            {
                writer.Write(tokenBytes);
                writer.Write(signature);
            }
            finalBytesToSend = stream.ToArray();

        }

其中 tokenBytes 、 signature 和 finaleBytesToSend 是字节数组。

正确吗?或者还有其他方法吗?

【问题讨论】:

  • 你有密码。有用吗?

标签: c# java windows-phone-8 stream


【解决方案1】:

大概我假设您正在编写 Java-C# 序列化方案。我认为您可能需要注意 3 件事:

  1. Java 字节数组输出的末尾可能包含特殊的分隔符。
  2. 如果字节数组中的数据最初不只是字节,那么 Java 默认使用 Big-Endian 编码;而 C# 默认为 Little Endian 编码。
  3. 对于字符串,Java 使用 UTF-16(Big Endian),而 C# UTF-16 默认为 Little Endian。

在我看来,如果你在 Java 和 C# 之间传输数据,你最好在 Java 端只使用 ByteBuffer,在 C# 端使用 MemoryStream/BinaryReader/BinaryWrite。在 C# 端正确设置 UTF-16 Big Endian,并为 int/long/double 原语等内容编写自己的反序列化程序。这使它起作用。

【讨论】:

  • 最好使用可移植的序列化格式,如 XML、JSON 或 Protocol Buffers……当然,如果 OP 不尝试从 Java 应用程序读取数据,则无法修改。
  • @Dennis 是的,也不是。取决于他想要处理的数据以及频率。由于他正在查看字节数组,因此我认为在这种情况下性能和 GC 很重要,这使所有 XML/JSON/Protocol Buffer 都处于尴尬境地。有些人可能认为 Protobuf 性能很高,但是如果你看它的 Java 实现,在序列化过程中会生成很多临时对象。当然,如果性能不是问题,一切都可以——但我怀疑 OP 会首先考虑字节格式。
  • @Alex 那我应该怎么做呢?我没听懂你说的。你能提供任何链接以供参考吗?
  • @Vaibhav 基本上如果你的数据是纯字节数据,最好使用 ByteBuffer;如果您的数据实际上是一些您需要解码的数据,例如strings ints doubles 等,您需要正确设置编码以及您自己的原始(int/double)阅读器。
猜你喜欢
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
相关资源
最近更新 更多