.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环境配置 相信 ...
随机推荐
- 【LeetCode】 sort list 单清单归并
称号:Sort a linked list in O(n log n) time using constant space complexity. 思路:要求时间复杂度O(nlogn) 知识点:归并排 ...
- 深入理解C指针之六:指针和结构体
原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...
- C--运算符,表达式和语句实例
//第五章 运算符,表达式和语句 #include<stdio.h> //引入头文件 #include<math.h> #define ADJUST 7.64 //定义常量 # ...
- exec 重定向
文件中常用的重定向: command > filename把把标准输出重定向到一个新文件中command >> filename 把把标准输出重定向到一个文件中 (追加)comman ...
- IIS7伪静态化URL Rewrite模块
原文 IIS7伪静态化URL Rewrite模块 在Win7安装了IIS7.5之后,搭建一些网站或者博客,但是IIS7.5本身没有URL Rewrite功能,也就是无法实现网址的伪静态化. 从网上找了 ...
- javascript通过数日两个日期之间的比较分离
$(function () { var starttime = transdate("2014-09-30 15:53:00"); var endtime = transdat ...
- 新服务器部署sqlserver之前的准备
当你有一个新的服务器需要部署的时候,如果没有部署过的经验很可能会走很多误区,并且给以后的维护工作加大难度,我在这就把我部署服务器的一些经验跟大家分享一下. 1.登陆服务器以后先将物理盘按照64k为分配 ...
- jq toggle1.9版本后不支持解决方案
<script type="text/javascript"> $(document).ready(function(){ $("button"). ...
- ichartjs 使用BUG,assign_scale:true 解决
今天纯属灌水,好久没灌水的. 最近使用了flotr2 和 ichartjs进行canvas图标的开发,都不能满足需求. 没办法,先将就用用吧.然后,既然其他大神推荐使用ichartjs,为了统一,我也 ...
- NET Socket服务编程
smark https://github.com/IKende/ .NET Socket服务编程之-高效连接接入编 在.NET上编写网络服务深入都有2,3年了,而这些时间时如何在.NET里实现网络服务 ...