用于发送段的C#BinaryWriter缓冲区

本文关键字:C#BinaryWriter 缓冲区 用于 | 更新日期: 2023-09-27 18:26:36

我不确定"Buffer"是否是我想要的,所以我会向你们展示我的问题,然后你们可以决定这是否是正确的单词和解决方案。目前,我正在为C#中的JavaDataOutputStream类创建一个网络端口。我要做的最后一件事是通过发送分段信息来解决这个问题。

这是我在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

示例输入(C#):

Client.WriteInt(1000);

示例输出(Java):

0
0
50331648
-402653184

输出应为:

1000

请耐心等待,因为我几天前刚学会C#,我可能在问一个愚蠢的问题。

用于发送段的C#BinaryWriter缓冲区

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);
}

请注意,从技术上讲,您不需要在shift之前将值v强制转换为uint。即使要进行符号扩展,也要屏蔽掉除最后一个字节之外的所有字节。但那部分不应该有任何伤害。

查看Jon Skeet的具有endian意识的BinaryWriter版本。这里有讨论和一些链接:BinaryWriter Endian问题