在我們的PC機中,C#的數字是LittleEndian的,導致在做網路通訊協定和和檔案解析時有許多不便,因此,我寫了個BigEndian的數位類,這裡記錄一下,以後還會經常用到。
static class BigEndianUIntHelper
{
public static uint ToUInt32(byte[] data)
{
Contract.Assume(data.Length <= 4);
return BitConverter.ToUInt32(new byte[4 - data.Length].Concat(data).Reverse().ToArray(), 0);
}
public static byte[] ToBytes(uint num, int size)
{
Contract.Assume(size <= 4);
return BitConverter.GetBytes(num).Take(size).Reverse().ToArray();
}
}
[StructLayout(LayoutKind.Sequential)]
struct BigEndianUInt24
{
const int size = 3;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = size)]
byte[] data;
public static implicit operator uint(BigEndianUInt24 d) { return BigEndianUIntHelper.ToUInt32(d.data); }
public static implicit operator BigEndianUInt24(uint d) { return new BigEndianUInt24() { data = BigEndianUIntHelper.ToBytes(d, size) }; }
public override string ToString() { return ((uint)this).ToString(); }
}
[StructLayout(LayoutKind.Sequential)]
struct BigEndianUInt32
{
const int size = 4;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = size)]
byte[] data;
public static implicit operator uint(BigEndianUInt32 d) { return BigEndianUIntHelper.ToUInt32(d.data); }
public static implicit operator BigEndianUInt32(uint d) { return new BigEndianUInt32 { data = BigEndianUIntHelper.ToBytes(d, size) }; }
public override string ToString() { return ((uint)this).ToString(); }
}
其實這裡BigEndianUIntHelper的兩個函數應該最佳化一下的,這裡為了圖簡單,就直接用BitConverter的現成方法了。以後有需要再弄好了。
相關文章:在C#中實作類別似位域的操作