【问题标题】:C# BinaryWriter buffer for sending segments?用于发送段的 C# BinaryWriter 缓冲区?
【发布时间】:2014-12-11 06:47:33
【问题描述】:

我不确定我正在寻找“缓冲区”,所以我将向您展示我的问题,然后你们可以决定这是否是正确的词和解决方案。目前我正在为 C# 中的 Java DataOutputStream 类创建一个网络端口。我要做的最后一件事是通过发送分段信息来解决这个问题。

这是我在 C# 中的 WriteInt 方法(ClientOutput 是 BinaryWriter 的一个实例

public void WriteInt(int v)
{
    ClientOutput.Write (((uint)v >> 24) & 0xFF);
    ClientOutput.Write (((uint)v >> 16) & 0xFF);
    ClientOutput.Write (((uint)v >> 8) & 0xFF);
    ClientOutput.Write (((uint)v >> 0) & 0xFF);
    IncCount (4);
}

对于任何想要比较的人;这是 Java

的原文
public final void writeInt(int v) throws IOException {
       out.write((v >>> 24) & 0xFF);
       out.write((v >>> 16) & 0xFF);
       out.write((v >>>  8) & 0xFF);
       out.write((v >>>  0) & 0xFF);
       incCount(4);
}

通常在 java 中,您必须先调用“Flush()”,然后才能将数据发送到服务器或客户端;但是,每当您调用“Write()

时,BinaryWriter 似乎都会自动刷新

这是 Java 中的“ReadInt()”代码。

public final int readInt() throws IOException {
        int ch1 = in.read();
        int ch2 = in.read();
        int ch3 = in.read();
        int ch4 = in.read();
        if ((ch1 | ch2 | ch3 | ch4) < 0)
            throw new EOFException();
        return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
}

当Java代码执行到“WriteInt”并在服务器上调用ReadInt时,该值正确显示;然而,目前服务器正在处理整数 4 次不同的时间,并根据段显示整数值。

示例输入(C#):

Client.WriteInt(1000);

示例输出(Java):

0
0
50331648
-402653184

什么时候输出应该是:

1000

请多多包涵,因为我几天前刚开始学习 C#,我可能会问一个愚蠢的问题。

【问题讨论】:

    标签: java c# input output binarywriter


    【解决方案1】:

    BinaryWriter 有一堆 Write() 方法重载,看起来您正在调用 Write(Int32) 重载,它当然会发送四个 4 字节整数。

    您应该能够通过在对 Write() 的调用中将值转换为字节来解决问题:

    public void WriteInt(int v)
    {
        ClientOutput.Write ((byte)(((uint)v >> 24) & 0xFF));
        ClientOutput.Write ((byte)(((uint)v >> 16) & 0xFF));
        ClientOutput.Write ((byte)(((uint)v >> 8) & 0xFF));
        ClientOutput.Write ((byte)(((uint)v >> 0) & 0xFF));
        IncCount (4);
    }
    

    请注意,从技术上讲,您不需要在移位之前将值 v 转换为 uint。即使要发生符号扩展,您仍然会屏蔽除最后一个字节之外的所有字节。但那部分不应该伤害任何东西。

    查看 Jon Skeet 的 BinaryWriter 字节序感知版本。这里有讨论和一些链接:BinaryWriter Endian issue

    【讨论】:

    • 我选择uint 的唯一原因是因为用java 编写的原始库使用了无符号移位。我认为这是有原因的,所以我保留了他们的方法。我回家后会试试这个,看看它是否有效。
    • 完美运行,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 2014-05-10
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2018-07-13
    相关资源
    最近更新 更多