C# 大小端转换

https://www.cnblogs.com/Jasmine-K/p/7659908.html

使用 BinaryPrimitives类 辅助转换

例如:获取了byte[] bufferSpan的内容,接下来就可以调用 BinaryPrimitives 静态类提供的方法进行转换

uint value = BinaryPrimitives.ReadUInt32BigEndian(bufferSpan);
这个类很丰富,调用方便

使用数组反转的方式转换

        public byte[] Big2Little(List<uint> bufferlist)
        {
            if (bufferlist == null || bufferlist.Count <= 0)
            {
                return null;
            }
            uint[] buffers = bufferlist.ToArray();
            for(int i=0;i< buffers.Length; i++)
            {
                //uint 是大端 例如:0x12345678
                buffers[i] = BitConverter.ToUInt32(BitConverter.GetBytes(buffers[i]).ToArray(), 0);
                //uint 是小端 例如:0x78563412
                //buffers[i] = BitConverter.ToUInt32(BitConverter.GetBytes(buffers[i]).Reverse().ToArray(), 0);
            }
            byte[] datas = new byte[buffers.Length * 4];
            Buffer.BlockCopy(buffers, 0, datas, 0, buffers.Length * 4);
            return datas;
        }

获取和设置byte的某一位

        /// <summary>
        /// 设置某一位的值
        /// </summary>
        /// <param name="data"></param>
        /// <param name="index">要设置的位, 值从低到高为 1-8</param>
        /// <param name="flag">要设置的值 true / false</param>
        /// <returns></returns>
        public byte Setbit(byte data, int index, bool flag)
        {
            if (index > 8 && index % 8 != 0)
            {
                index = index % 8;
            }
            else if (index > 8 && index % 8 == 0)
            {
                index = 8;
            }
            int v = index < 2 ? index : (2 << (index - 2));
            return flag ? (byte)(data | v) : (byte)(data & ~v);
        }

       /// <summary>
        /// 获取字节中的指定Bit的值
        /// </summary>
        /// <param name="frame">字节</param>
        /// <param name="index">Bit的索引值(0-7)</param>
        /// <returns></returns>
        public static int GetBit( byte frame, short index)
        {
            byte x = 1;
            switch (index)
            {
                case 0: { x = 0x01; } break;
                case 1: { x = 0x02; } break;
                case 2: { x = 0x04; } break;
                case 3: { x = 0x08; } break;
                case 4: { x = 0x10; } break;
                case 5: { x = 0x20; } break;
                case 6: { x = 0x40; } break;
                case 7: { x = 0x80; } break;
                default: { return 0; }
            }
            return (frame & x) == x ? 1 : 0;
        }
posted @   小黑猫zz  阅读(141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示