我不确定“缓冲区”是我正在寻找的,所以我会告诉你我的问题然后你们可以决定这是正确的单词和解决方案。目前我正在为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#,我可能会问一个愚蠢的问题。
答案 0 :(得分:0)
BinaryWriter有一堆Write()方法重载,看起来你正在调用Write(Int32)重载,当然它会发送四个4字节整数。
您应该能够通过在Write()调用中将值转换为byte来解决问题:
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的EndaryWriter的endian感知版本。这里有讨论和一些链接:BinaryWriter Endian issue