我在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
一切正常,但是:
我看到了这张图片:
但我感兴趣的部分是"网络订单 - 在Big Endian"
我在维基读到了
许多IETF RFC使用术语网络顺序,表示顺序 在网络协议中通过线路传输比特和字节。 其中,历史悠久的RFC 1700(也称为Internet标准 STD 2)已将其网络顺序定义为大端,但不是全部 协议。
问题
如果Java uses big endian且tcp也使用"网络订单" - 大端 -
那么为什么 - 在我的C#中 - 我必须检查它是否是大端?
我的意思是我能做到:
Array.Reverse(ba);
不检查:if (BitConverter.IsLittleEndian) Array.Reverse(ba);
我是对的吗?
如果是这样,那么一些未知来源向我发送数据的情况怎么样?我不知道他是否发送了大端或小端?他必须给我发一个第一个字节来表明对吗?但第一个字节也受字节序的影响.....我的误解在哪里?
答案 0 :(得分:3)
你假设这是一个大端的32位,你也可以假设BitConverter有一个默认的小端(或者你可以把它改成big endian而不是首先反转它)BTW ByteBuffer支持小端也是。
你也可以发送小端
os.write(ByteBuffer.allocate(4)
.order(ByteOrder.LITTLE_ENDIAN)
.putInt(data)
.array());
一些未知来源向我发送数据的情况怎么样?我不知道他是否发送了大端或小端?
然后你肯定不知道如何解码它。您可以猜测您是否有足够的数据。
他必须向我发送第一个字节以表明对吗?
她可以,但你必须知道第一个字节告诉你顺序以及如何插入第一个字节。更容易假设给定的字节顺序。
但第一个字节也受字节顺序的影响
因此想象一个字节是用小端或大端编写的。怎么会有什么不同? ;)