【发布时间】:2016-06-16 21:55:13
【问题描述】:
我无法理解网络字节顺序以及通过 UDP 发送和接收数据的顺序。我正在使用 C#。
我有一个结构持有:
message.start_id = 0x7777CCCC;
message.message _id = 0xBBB67000;
more data
消息定义有[StructLayout(LayoutKind.Sequential)]。我首先使用以下方法将结构转换为字节数组:
public byte[] StructureToByteArray(object obj)
{
int len = Marshal.SizeOf(obj);
byte[] arr = new byte[len];
IntPtr ptr = Marshal.AllocHGlobal(len);
Marshal.StructureToPtr(obj, ptr, true);
Marshal.Copy(ptr, arr, 0, len);
Marshal.FreeHGlobal(ptr);
return arr;
}
然后我检查字节顺序:
if (BitConverter.IsLittleEndian)
{
Array.Reverse(packet);
}
那我就发了
socket.SendTo(packet, endPoint);
当我发送这个时,接收端接收到的消息应用了正确的字节顺序,但是字节顺序相反,所以在wireshark中我得到:
剩下的.....BBB67000 7777CCCC
当我期待时:7777CCCC BBB67000 ...........其余的。
我的期望是正确的还是正常的,结构中的第一个字节是最后一个到达的?
【问题讨论】:
-
字节序不应该应用于整个数据包 - 它应该应用于各个部分......我认为它是每 32 位,但我不是 100% 的。跨度>
-
和迈克尔·布雷说的差不多。字节序应用于各个部分(对于
start_id和message_id分别应用),并且它是在字节级别的(所以在一个 4 字节的 int 中,第一个与第四个字节交换,第二个与第三)
标签: c# arrays udp endianness