我试图将C#客户端写入用Java编写的服务器。服务器需要一个4字节(Java中为DataInputStread readInt())的消息头,后跟实际的消息。

我绝对不熟悉C#,如何将这个消息头发送到Java Server?我尝试了几种方法(大多数情况下都是反复试验,而又不深入C#语言),但没有任何效果。 Java端的消息长度不正确(很大)。

最佳答案

正如其他张贴者所指出的那样,它是按字节顺序排列的。

Java DataInputStream期望数据为big-endian(网络字节顺序)。从Mono文档(对于像BinaryWriter这样的对等物)来看,C#倾向于使用低位优先(Win32/x86的默认设置)。

因此,当您使用标准类库将32位int'1'更改为字节时,它们会产生不同的结果:

//byte hex values
Java: 00 00 00 01
  C#: 01 00 00 00

您可以更改在C#中编写int的方式:
private static void WriteInt(Stream stream, int n) {
    for(int i=3; i>=0; i--)
    {
        int shift = i * 8; //bits to shift
        byte b = (byte) (n >> shift);
        stream.WriteByte(b);
    }
}

编辑:

一种更安全的方法是:
private static void WriteToNetwork(System.IO.BinaryWriter stream, int n) {
    n = System.Net.IPAddress.HostToNetworkOrder(n);
    stream.Write(n);
}

09-30 17:12
查看更多