Endian在网络和多平台 - 澄清?

时间:2014-11-07 08:37:48

标签: java c# networking endianness

我在JAVA中有这段代码:

socket = new Socket("127.0.0.1", 10);
OutputStream os = socket.getOutputStream();
os = socket.getOutputStream();


int data=50000;
os.w.write(data.toByteArray());
os.write(ByteBuffer.allocate(4).putInt(data).array());

在C#中:

byte[] ba = readint(networkStream);
networkStream.Flush();
if (BitConverter.IsLittleEndian) Array.Reverse(ba);
int i = BitConverter.ToInt32(ba, 0); //50000

一切正常,但是:

我看到了这张图片:

enter image description here

但我感兴趣的部分是"网络订单 - 在Big Endian"

我在维基读到了

  

许多IETF RFC使用术语网络顺序,表示顺序   在网络协议中通过线路传输比特和字节。   其中,历史悠久的RFC 1700(也称为Internet标准   STD 2)已将其网络顺序定义为大端,但不是全部   协议。

问题

如果Java uses big endian且tcp也使用"网络订单" - 大端 -

那么为什么 - 在我的C#中 - 我必须检查它是否是大端?

我的意思是我能做到:

Array.Reverse(ba);

检查:if (BitConverter.IsLittleEndian) Array.Reverse(ba);

我是对的吗?

如果是这样,那么一些未知来​​源向我发送数据的情况怎么样?我不知道他是否发送了大端或小端?他必须给我发一个第一个字节来表明对吗?但第一个字节也受字节序的影响.....我的误解在哪里?

1 个答案:

答案 0 :(得分:3)

你假设这是一个大端的32位,你也可以假设BitConverter有一个默认的小端(或者你可以把它改成big endian而不是首先反转它)BTW ByteBuffer支持小端也是。

你也可以发送小端

os.write(ByteBuffer.allocate(4)
                   .order(ByteOrder.LITTLE_ENDIAN)
                   .putInt(data)
                   .array());
  

一些未知来​​源向我发送数据的情况怎么样?我不知道他是否发送了大端或小端?

然后你肯定不知道如何解码它。您可以猜测您是否有足够的数据。

  

他必须向我发送第一个字节以表明对吗?

她可以,但你必须知道第一个字节告诉你顺序以及如何插入第一个字节。更容易假设给定的字节顺序。

  

但第一个字节也受字节顺序的影响

因此想象一个字节是用小端或大端编写的。怎么会有什么不同? ;)