.net下简单快捷的数值高低位切换
.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下简单快捷的数值高低位切换的更多相关文章
- P1100 高低位切换
这个题很简单 直接用左移位(<<)和右移位(>>)就可以过了 #include<iostream> #include<cstdio> using nam ...
- 字节的高低位知识,Ascii,GB2312,UNICODE等编码的关系与来历
很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节". 再后来,他们又做了一些可以处理 ...
- windows下简单的缓冲区溢出
缓冲区溢出是什么? 当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被“撑爆”,从而覆盖了相邻内存区域的数据 成功修改内存数据,可造成进程劫持,执行恶意代码,获取服务器控制权等 ...
- MySQL数据库的优化(下)MySQL数据库的高可用架构方案
MySQL数据库的优化(下)MySQL数据库的高可用架构方案 2011-03-09 08:53 抚琴煮酒 51CTO 字号:T | T 在上一篇MySQL数据库的优化中,我们跟随笔者学习了单机MySQ ...
- Linux下简单的socket通信实例
Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...
- Dollar Dayz(大数母函数,高低位存取)
Dollar Dayz Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5655 Accepted: 2125 Descr ...
- Linux下简单的取点阵字模程序
源:Linux下简单的取点阵字模程序 Linux操作系统下进行简单的图形开发,经常会用到取字模的软件,但是Linux并没有像Windows下的小工具可用,我们也并不希望为了取字模而频繁地切换操作系统. ...
- C语言如何分离一个数的高低位,如何将2个字节变成一个字节
关于这个概念,是我从工作中学习的,虽然在读书的时候就应该要掌握,但是在开发中,这项技能尤其重要.我是做嵌入式开发的,在嵌入式开发过程中,如何对数据操作必然是不可缺少的问题,接下来,我们来看一个例子: ...
- windows系统下简单nodejs安装及环境配置
相信对于很多关注javascript发展的同学来说,nodejs已经不是一个陌生的词眼,这里不想谈太多的nodejs的相关信息.只说一下,windows系统下简单nodejs环境配置 相信 ...
随机推荐
- Yii Framework2.0开发教程(10)配合mysql数据库实现用户登录
1.首先在mysql创建一个存用户的表格 create table test_user ( user_id bigint(20) unsigned not null auto_increment co ...
- Swift入门教程:基本语法(五)
断言 断言是一种实时检测条件是否为true的方法 如果条件为true,那么代码继续执行 如果条件为false,就抛出错误信息,直接终止程序的运行 断言的用法 使用全局的assert函数 passe ...
- gpu显存(全局内存)在使用时数据对齐的问题
全局存储器,即普通的显存,整个网格中的随意线程都能读写全局存储器的任何位置. 存取延时为400-600 clock cycles 很easy成为性能瓶颈. 訪问显存时,读取和存储必须对齐,宽度为4B ...
- oracle 电子商务解决方案讲义
1. 电商营销(CRM) - 高端客户体验 2. 当当网李国庆做 "千千面"购物体验 3. 所使用的唯一的产品oracle的CRM 4. 个人的事情.谁在世界上是用户体验. 5. ...
- Highcharts图表导出为pdf的JavaWeb实践
写给读者的话^_^: 众所周知,基于Highcharts插件生成的svg图片组(注意这里鄙人指的组是若干图有序组合,并非一张图片,具有业务意义)导出为PDF文档是有难度滴.鄙人也曾“异想天开”用前端技 ...
- php学习之路:php在iconv功能 详细解释
iconv函数库可以完毕各种字符集间的转换,是php编程中必不可少的基础函数库. 使用方法例如以下: $string = "亲爱的朋友欢迎訪问胡文芳的博客.希望给您带来一点点的帮助!&quo ...
- Java集合之HashMap源码实现分析
1.简介 通过上面的一篇随笔我们知道了HashSet的底层是采用Map实现的,那么Map是什么?它的底层又是如何实现的呢?这下我们来分析下源码,看看具体的结构与实现.Map 集合类用于存储元素对(称作 ...
- ventBroker简单实现
C#编程实践—EventBroker简单实现 前言 话说EventBroker这玩意已经不是什么新鲜货了,记得第一次接触这玩意是在进第二家公司的时候,公司产品基础架构层中集成了分布式消息中间件,在.n ...
- C#编程实践–产假方案优化版
前言 既然作为一个踏踏实实学习技术的人,就要有一颗谦卑.虚心和追求卓越的心,我不能一次就写出很完美的代码,但我相信,踏踏实实一步一步的优化,代码就可以变得趋近完美,至少在某一个特定场景下相对完美,这和 ...
- 来自 Repository 的一丝线索,Domain Model 再重新设计
来自 Repository 的一丝线索,Domain Model 再重新设计 写在前面 阅读目录: 疑惑解读 设计窘境 一幅图的灵感 为嘛还是你-Repository 后记 上一篇<No zuo ...