当前位置: 首页 > news >正文

.net下简单快捷的数值高低位切换

做网络通讯中数值传输是很普遍的事情,但数值的存储在不平台和硬件上存储方式都不一样,主要有两大类分别是高位和低位存储;而.net平台下是低位存储,通过.net提供的函数读写是低位也不提供设置;对于高位存储的就有比较流行的语言平台有Java。由于存储不一样所以在读取和写入的时候就需要另一方面做转换。在.net下其实简单地通过反转数组或移位存储的方式可以简单的进行高位转换。不过程序已经写好了而在读写的时候用了低位,又不想修改读写代码可以简单地通过以下函数对数值转换一下即可.

代码(在一个老外网站找到的)

class Endian
    {
        public static short SwapInt16(short v)
        {
            return (short)(((v & 0xff) << 8) | ((v >> 8) & 0xff));
        }
        public static ushort SwapUInt16(ushort v)
        {
            return (ushort)(((v & 0xff) << 8) | ((v >> 8) & 0xff));
        }
        public static int SwapInt32(int v)
        {
            return (int)(((SwapInt16((short)v) & 0xffff) << 0x10) |
                          (SwapInt16((short)(v >> 0x10)) & 0xffff));
        }
        public static uint SwapUInt32(uint v)
        {
            return (uint)(((SwapUInt16((ushort)v) & 0xffff) << 0x10) |
                           (SwapUInt16((ushort)(v >> 0x10)) & 0xffff));
        }
        public static long SwapInt64(long v)
        {
            return (long)(((SwapInt32((int)v) & 0xffffffffL) << 0x20) |
                           (SwapInt32((int)(v >> 0x20)) & 0xffffffffL));
        }
        public static ulong SwapUInt64(ulong v)
        {
            return (ulong)(((SwapUInt32((uint)v) & 0xffffffffL) << 0x20) |
                            (SwapUInt32((uint)(v >> 0x20)) & 0xffffffffL));
        }
    }

以上这个类是的方法是针对数据高低位相互转换的函数,即高转低和低转高都可行。

使用

 在.net平台下通过BitConverter得到的数值存储是低位

int a = 1;
byte[] data = BitConverter.GetBytes(a);

以上代码得到的byte分别是[1,0,0,0]

a = Endian.SwapInt32(a);
data = BitConverter.GetBytes(a);

在GetBytes前通过前面简单的函数转换一下,即可得到高位存储的结果[0,0,0,1]

总结

  由于在编写Beetle的时候低层没有考虑这玩意,所以对转byte[]修改范围比较大,通过这个函数相对来说就简化了很多工作的同降低了大量的测试时间。

        /// <summary>
        /// 写入一个ushort
        /// </summary>
        /// <param name="value">ushort</param>
        public unsafe void Write(ushort value)
        {
            if (!LittleEndian)
                value = Endian.SwapUInt16(value);
            if (mCurrentBuffer.CanWrite(2))
            {
                fixed (byte* ptr = &mCurrentBuffer.Data[mCurrentBuffer.Postion])
                {
                    *(ushort*)ptr = value;
                }
                mCurrentBuffer.Add(2);
                mLength += 2;
 
            }
            else
            {
                fixed (byte* ptr = &mTempData[0])
                {
                    *(ushort*)ptr = value;
                }
                Write(mTempData, 0, 2);
            }
 
        }
 
      /// <summary>
        /// 读取一个short值
        /// </summary>
        /// <returns>short</returns>
        public unsafe short ReadShort()
        {
            short result;
            if (mCurrentBuffer.CanRead(2) == 2)
            {
                fixed (byte* ptr = &mCurrentBuffer.Data[mCurrentBuffer.Postion])
                {
                    result = *(short*)ptr;
                }
                mCurrentBuffer.Read(2);
            }
            else
            {
                Read(mTempData, 0, 2);
                result = BitConverter.ToInt16(mTempData, 0);
            }
            if (!LittleEndian)
                result = Endian.SwapInt16(result);
            return result;
        }

如果你的低层代码写好了,不想动那些代码,只需要在你代码的入口处和出口入添加Endian处理即可.

 

 

 

相关文章:

  • 用两个字节表示一个16位的int
  • [资源] Visual Studio 2015正式版离线iso及在线下载,附专业版和企业版可用key!
  • 【软件版本简称大全】版本名称GA的含义:SNAPSHOT-alpha-beta-release-GA
  • windows环境下 定时自动备份Mysql数据库
  • C#的winform点长方形的上下左右三角形,画三角形,画四边形,是否在内部。
  • Windows下配置Redis多实例
  • windows系统自动备份mysql数据库的方法 mysqldump
  • 学习Gulp的记录
  • windows下mysql 5.7版本中修改编码为utf-8的方法
  • MySQL主从复制,实时,双机热备份。
  • Redis缓存清理
  • IOC容器:Unity
  • 依赖注入 与 抽象工厂
  • C#获取硬盘序列号,CPU序列号,网卡MAC地址
  • mysql 表分区设置
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • DOM的那些事
  • EOS是什么
  • JS函数式编程 数组部分风格 ES6版
  • mongodb--安装和初步使用教程
  • Python打包系统简单入门
  • Python实现BT种子转化为磁力链接【实战】
  • session共享问题解决方案
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 彻底搞懂浏览器Event-loop
  • 仿天猫超市收藏抛物线动画工具库
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 前端面试题总结
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • scrapy中间件源码分析及常用中间件大全
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • ![CDATA[ ]] 是什么东东
  • #宝哥教你#查看jquery绑定的事件函数
  • (MATLAB)第五章-矩阵运算
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)php投票系统 毕业设计 121500
  • (黑马C++)L06 重载与继承
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (未解决)macOS matplotlib 中文是方框
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)LINQ之路
  • (转)linux下的时间函数使用
  • (转载)深入super,看Python如何解决钻石继承难题
  • (轉)JSON.stringify 语法实例讲解
  • .axf 转化 .bin文件 的方法
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 获取url的方法
  • .net 提取注释生成API文档 帮助文档
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • /etc/fstab和/etc/mtab的区别