专栏首页日常分享DWORD WORD到INT的转换

DWORD WORD到INT的转换

最近在做一个有关TCP/TP通信的消息解析,涉及到了这方面的转换,记录一下。

首先,如果是在网络传输、消息解析的情况下,要注意一下网络传送使用的是大端还是小端模式,这影响到我们的高低位的传输顺序


 WORD&&DWORD

  WORD: 无符号双字节整形(字,16位)

  DWORD:无符号四字节整形 (双字,32位)

Byte:8位


解析方式

  采用Java位操作来实现(采用大端方式,故先传递高位,则接收方低位为高)

//转换DWORD到整型数据
    private int DWORDtoInt(byte[] sourceArr,int start){
        //len=4,inArr为获取到的4位Byte数组
        byte[] intArr=spiltByteArr(sourceArr,start,4);
        return intArr[0]<<24|intArr[1]<<16|intArr[2]<<8|intArr[3];
    }

    //转换WORD到整形数据
    private int WORDtoInt(byte[] sourceArr,int start){
        //len=2,intArr为获取到的2为Byte数组
        byte[] intArr=spiltByteArr(sourceArr,start,2);
        return intArr[0]<<8|intArr[1];
    }

Java 位操作(参考博客:https://blog.csdn.net/lazyman_54/article/details/51283459

简介

说到位运算,自然说的全部都是二进制运算,相信大家都比较熟悉,但我还是要说明(啰嗦)一下,java里int型是4个字节,即32位,用二进制表示java里的1就是000……0001,这些都是有符号的数,也就是最高位代表符号位,也就是32位能表示的最大整数是2的32次方-1.下面举得栗子,我不会自己为难自己,搞十几位数,所有都是二位数,所有只用一个字节,且最高依然代表符号位。

& 与运算符

与运算符就相当于&&,不同的是,这是按位对比,比如8&9,用十进制的眼光去看简直就瞎了,8&9其实做的运算就是00001000&00001001,然后看到当且仅当两个对应的位置都是1,结果才是1,否则结果为0,那么结果就是00001000,也就是8.  那么,这个运算有什么卵用么?答案是当然有啦,比如,我们现在都是用int去做标志位,比如1代表正常,0代表异常,那如果我们用二进制来做的话,不就很爽了么,0001代表正常0010代表异常,0100代表XXX,是不是想想都有点小激动·····

| 或运算符

或运算符就相当于||, 当然也是按位去或的,当且仅当两个对应的位置都是0,结果才是0,否则结果是1,那么8|9就是00001000|00001001,结果就是00001001=9。至于这个有什么用,我就不赘述了,有规则就会有用,就这么简单·····

~运算符

非运算符是又得讲一下的,理解起来很容易的,就是按位取反,比如~8对吧,那就是00001000按位取反结果是11110111.前面说了,这是有符号数,也就是最高位代表符号位,也就是~8的结果是一个负数,那么人类第一反应是-8,但结果却不是,那这里简单解析一下,负数的二进制表示方式跟正数不一样,负数有一个反码和补码的概念,这么理解呢?就说-8吧,用二进制表示-8是:11111000,-10的二进制是:11110110.  首先-8的绝对值8的二进制是00001000, 求其反码就是11110111,补码(+1)是11111000。那么上面~8的结果11110111是多少呢?我们算一下,先-1得到11110110,然后取反:00001001,得到9,那么~8==9?不是的,是结果的绝对值,因为是负数,所以是-9.这个结果大家可以去验证下~~~

^异或运算符

异或运算是:当运算符两边不同的时候结果为1,两边相同的时候结果为0 这就是传说中的同性相杀,异性相吻。举个例子就是:8^6=1000^0110=1110=14

>>位移运算符(<<同理)

位移运算符我们可以简单的理解为乘除法,像左移是除法,向右移是乘法。这个符号位是不移动的,注意下。8>>2大家不要理解为8/2,位移两位就是除以2的2次方也就是8/4.这里注意9>>1的结果是4,即最低位的1会移没了··当然了<<如果结果超过了最大整数能表示的范文,那就·····你懂的。

>>> 这个应该是无符号的位移运算符

这个运算符跟>>差不多,不同点是,它移动后高位补0,。好像>>位移后高位也是补0啊,是的,但符号位不移动,而>>>tm符号位都移动了,就是负数一移就正了·····

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring AOP的一个简单实现

    首先配置XML:service采用和之前一样的代码,只是没有通过实现接口来实现,而是直接一个实现类。transactionManager依旧为之前的事务管理器。

    Rekent
  • MyBatis 基本构成与框架搭建

            根据配置信息(eg:mybatis-config.xml)或者代码来生成SqlSessionFactory。

    Rekent
  • LeetCode(一)

    Given an array of integers, return indices of the two numbers such that they add...

    Rekent
  • [C语言]九九乘法表

    雨落凋殇
  • 从勾股定理,到费马大定理,再到椭圆曲线,一部辉煌壮丽的数学史诗

    申龙斌
  • LeetCode 3: 无重复字符的最长子串

    Given a string, find the length of the longest substring without repeating chara...

    爱写bug
  • 公共钥匙盒-CSP数组排序练习

      有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家。每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门...

    开心鸭
  • PAT 1012 The Best Rank

    1012. The Best Rank (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B ...

    ShenduCC
  • 737. Find Elements in Matrix哈希表查找

    Given a matrix, find a element that appear in all the rows in the matrix.You can...

    和蔼的zhxing
  • C++核心准则C.181:避免使用"暴露的"联合体

    A naked union is a union without an associated indicator which member (if any) i...

    面向对象思考

扫码关注云+社区

领取腾讯云代金券