簡體   English   中英

C#從byte []轉換為struct。 字節順序錯誤

[英]C# Converting from byte[] to struct. The byte order is wrong

在實現基於UDP的協議時,我試圖使用結構來解析套接字數據。 我搜索了,我可以使用這兩個函數在byte []和struct之間進行轉換:

 byte[] StructToBytes(object structObj)
    {
        int size = Marshal.SizeOf(structObj);
        IntPtr buffer = Marshal.AllocHGlobal(size);
        try
        {
            Marshal.StructureToPtr(structObj, buffer, false);
            byte[] bytes = new byte[size];
            Marshal.Copy(buffer, bytes, 0, size);
            return bytes;
        }
        finally
        {
            Marshal.FreeHGlobal(buffer);
        }

    }

    static object BytesToStruct(byte[] bytes, Type strcutType, int offset = 0)
    {
        int size = Marshal.SizeOf(strcutType);
        IntPtr buffer = Marshal.AllocHGlobal(size);
        try
        {
            Marshal.Copy(bytes, offset, buffer, size);
            return Marshal.PtrToStructure(buffer, strcutType);
        }
        finally
        {
            Marshal.FreeHGlobal(buffer);
        }
    }

然后我遇到了這個問題:

//I defined a simple struct with an ushort member
    [StructLayout(LayoutKind.Sequential, Pack = 2)]
    struct S
    {
        public ushort a;
    }

    //Then I define a byte[]
    byte[] bArr;
    bArr[0] = 0;
    bArr[1] = 1;

    //Convert to struct
    S s = (S)BytesToStruct(bArr, typeof(S));
    //Then s.a = 0x0100 not 0x0001

而struct到byte []也是一樣的。 ushort的2個字節是相反的。 我該如何解決這個問題?

如今大多數處理器都使用Little-Endian字節排序(最低有效字節排在第一位)。 網絡字節排序是傳統的Big-Endian,因此您通常需要鏡像字節順序。 您可以使用System.BitConverter.IsLittleEndian檢查系統的字節順序

提到的ntohs()的.Net等價物(奇怪地)位於System.Net.IPAddress.NetworkToHostOrder()

您還可以編寫自己的機制,使用位移和邏輯OR直接以正確的順序讀取字節。

網絡字節順序和主機字節順序之間存在差異。

通常,至少在C中,您使用ntohl(),ntohs()和朋友在從套接字讀取時將網絡字節順序轉換為主機順序。

問題在於系統short的字節順序。 看看關於字節序的這個問題 ,這可能會提供一些指示(雙關語無意)。

另外,我建議在struct類型BytesToStruct泛型:

static S BytesToStruct<S>(byte[] bytes, int offset = 0)

所以它可以調用

BytesToStruct<S>(bArr)

而不是目前

(S)BytesToStruct(bArr, typeof(S))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM