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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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得到的数值存储是低位

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

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

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

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

总结

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/// <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处理即可.

.net下简单快捷的数值高低位切换的更多相关文章

  1. P1100 高低位切换

    这个题很简单 直接用左移位(<<)和右移位(>>)就可以过了 #include<iostream> #include<cstdio> using nam ...

  2. 字节的高低位知识,Ascii,GB2312,UNICODE等编码的关系与来历

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节". 再后来,他们又做了一些可以处理 ...

  3. windows下简单的缓冲区溢出

    缓冲区溢出是什么? 当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被“撑爆”,从而覆盖了相邻内存区域的数据 成功修改内存数据,可造成进程劫持,执行恶意代码,获取服务器控制权等 ...

  4. MySQL数据库的优化(下)MySQL数据库的高可用架构方案

    MySQL数据库的优化(下)MySQL数据库的高可用架构方案 2011-03-09 08:53 抚琴煮酒 51CTO 字号:T | T 在上一篇MySQL数据库的优化中,我们跟随笔者学习了单机MySQ ...

  5. Linux下简单的socket通信实例

    Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...

  6. Dollar Dayz(大数母函数,高低位存取)

    Dollar Dayz Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5655   Accepted: 2125 Descr ...

  7. Linux下简单的取点阵字模程序

    源:Linux下简单的取点阵字模程序 Linux操作系统下进行简单的图形开发,经常会用到取字模的软件,但是Linux并没有像Windows下的小工具可用,我们也并不希望为了取字模而频繁地切换操作系统. ...

  8. C语言如何分离一个数的高低位,如何将2个字节变成一个字节

    关于这个概念,是我从工作中学习的,虽然在读书的时候就应该要掌握,但是在开发中,这项技能尤其重要.我是做嵌入式开发的,在嵌入式开发过程中,如何对数据操作必然是不可缺少的问题,接下来,我们来看一个例子: ...

  9. windows系统下简单nodejs安装及环境配置

      相信对于很多关注javascript发展的同学来说,nodejs已经不是一个陌生的词眼,这里不想谈太多的nodejs的相关信息.只说一下,windows系统下简单nodejs环境配置     相信 ...

随机推荐

  1. POJ3342——Party at Hali-Bula

    Party at Hali-Bula Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5418   Accepted: 192 ...

  2. 如何清除应用程序承载 WebBrowser 控件时缓存

    原文:如何清除应用程序承载 WebBrowser 控件时缓存 http://support.microsoft.com/kb/262110/zh-cn察看本文应用于的产品 function loadT ...

  3. POJ 2492 并查集应用的扩展

    A Bug's Life Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 28651 Accepted: 9331 Descri ...

  4. 【翻译自mos文章】SYS_OP_C2C 导致的全表扫描(fts)/全索引扫描

    SYS_OP_C2C 导致的全表扫描(fts)/全索引扫描 參考原文: SYS_OP_C2C Causing Full Table/Index Scans (Doc ID 732666.1) 适用于: ...

  5. hibernate的orphanRemoval

    在@OneToMany与@OneToOne中使用orphanRemoval = true时候 改动保存时候setXXX org.springframework.orm.hibernate3.Hiber ...

  6. 关于android中sqllite对时间的操作

    sql 中有时间的类型,date,time,datetime,方便关于记录的维护,下面一个demo演示怎么在每条记录中默认增加时间 源码下载地址 http://www.codes51.com/code ...

  7. JavaScript中的作用域和声明提前

    [翻译]JavaScript中的作用域和声明提前 原文:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html ===翻译 ...

  8. 原生JS的DOM节点操作

    DOM(Document Object Model/文档对象模型)是针对HTML和XML文档的一个API.DOM节点树:在文档中出现的空格.回车.标签.注释.文本.doctype.标签等都属于DOM节 ...

  9. VS2015 ASP.NET5 Web项目

    VS2015 ASP.NET5 Web项目结构浅析   前言 本文个人同步博客地址http://aehyok.com/Blog/Detail/76.html 在安装好VS2015之后,一直想看看新版本 ...

  10. cocos2dx对于强大的RichText控制

    最近准备做一个聊天系统,开始准备使用cocos2dx的UIRichText控制显示屏聊天,在使用中发现的结果,cocos2dx的RichText很有限.全然不具备实现聊天的功能.仅仅实现了增加文本.图 ...