zoukankan      html  css  js  c++  java
  • 在C#中实现BigEndian的数字

    在我们的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#中实现类似位域的操作 

  • 相关阅读:
    单独编译和使用webrtc音频回声消除模块(附完整源码+测试音频文件)(转)
    Android手机直播(三)声音采集
    Android 音视频去回声、降噪(Android音频采集及回音消除)(转)
    Android中Selector的setSelected“方法不管用”
    Github的快捷键
    哔哩哔哩视频显示在Github的Markdown博客页方法
    小巧的屏幕录像软件oCam
    win7各种插件的下载与使用
    3D 打印机选择说明文档
    在Ubuntu 18.04中安装Pycharm及创建Pycharm快捷方式
  • 原文地址:https://www.cnblogs.com/TianFang/p/1942435.html
Copyright © 2011-2022 走看看