0xff_0xffffffff - CSDN
精华内容
参与话题
  • 从0x00到0xFF的含义

    万次阅读 2018-05-09 17:59:22
    对于二进制来说,8位二进制我们称之为一个字节,二进制的表达范围值是从0b00000000~0b11111111,而我们程序中用十六进制表示的时候就是从0x00到0xFF,这里教大家一个二进制转换十进制和十六进制的方法,二进制4位一...
    对于二进制来说,8位二进制我们称之为一个字节,二进制的表达范围值是从0b00000000~0b11111111,而我们程序中用十六进制表示的时候就是从0x00到0xFF,这里教大家一个二进制转换十进制和十六进制的方法,二进制4位一组,遵循8,4,2,1的规律比如 1010,那么从最高位开始算,数字大小是8*1+4*0+2*1+1*0 = 10,那么十进制就是10,十六进制就是0xA。尤其二进制转十六进制的时候,十六进制一位刚好是和二进制的4位相互对应的,这些大家不需要强行记忆,用几次就熟练了。
    展开全文
  • 0xff到底是多少

    千次阅读 2019-07-29 11:07:58
    var a = 0xff; console.log(a); // 255 /* ff也就是8个1 11111111 ->2的8次方-1 */ 分析: 0x其实就是16进制,15*16 + 15 = 255 或者: 转化为2进制,就是8个1,因此也是255 ...
    var a = 0xff;
    console.log(a); // 255
    
    /*
    ff也就是8个1
    11111111 ->2的8次方-1
    */

    分析:

    0x其实就是16进制,15*16 + 15 = 255

    或者:

    转化为2进制,就是8个1,因此也是255

    展开全文
  • 详解 & 0xff 的作用

    万次阅读 多人点赞 2019-03-31 09:43:35
    表示按位与,只有两个位同时为1,才能得到1, 0x代表16进制数,0xff表示的数二进制1111 1111 占一个字节.和其进行&操作的数,最低8位,不会发生变化. 下面着重来说说&0xff都有哪些应用: 1. 只是为了取得低八位 ...

    首先我们要都知道, &表示按位与,只有两个位同时为1,才能得到1, 0x代表16进制数,0xff表示的数二进制1111 1111 占一个字节.和其进行&操作的数,最低8位,不会发生变化.

    下面着重来说说&0xff都有哪些应用:

    1. 只是为了取得低八位

    通常配合移位操作符>>使用

    例如:java socket通信中基于长度的成帧方法中,如果发送的信息长度小于65535字节,长度信息的字节

    定义为两个字节长度。这时候将两个字节长的长度信息,以Big-Endian的方式写到内存中

    out.write((message.length>>8)&0xff);//取高八位写入地址
    out.write(message.length&0xff);//取低八位写入高地址中
    

    例如,有个数字 0x1234,如果只想将低8位写入到内存中 0x1234&0xff
    0x1234 表示为二进制 0001001000110100

    0xff 表示为二进制 11111111

    两个数做与操作,显然将0xff补充到16位,就是高位补0

    此时0xff 为 0000000011111111

    与操作 1&0 =0 1&1 =1 这样 0x1234只能保留低八位的数 0000000000110100 也就是 0x34

    2. 保证补码的一致性

    我们只关心二进制的机器数而不关注十进制的值,那么byte &0xff只是对其最低8位的复制,通常配合逻辑或 ‘’|’'使用,达到字节的拼接,但不保证其十进制真值不变

    public static void main(String[] args) {
    		byte b = -127;//10000001
    		int a =  b;
    		System.out.println(a);
    		a =  b&0xff;
    		System.out.println(a);
    	}//输出结果-127,129
    

    乍一看,b是8位的二进制数,在与上0xff(也就是 11111111),不就是其本身吗,输出在控制台结果为什么是129呢?

    首先计算机内的存储都是按照补码存储的,-127补码表示为 1000 0001

    int a = b;将byte 类型提升为int时候,b的补码提升为 32位,补码的高位补1,也就是

    1111 1111 1111 1111 1111 1111 1000 0001

    负数的补码转为原码,符号位不变,其他位取反,在加1,正数的补码,反码都是本身

    结果是 1000 0000 0000 0000 0000 0000 0111 1111表示为十进制 也是 -127

    也就是 当 byte -> int 能保证十进制数不变,但是有些时候比如文件流转为byte数组时候,

    我们不是关心的是十进制数有没有变,而是补码有没有变,这时候需要&上0xff

    本例子中,将byte转为int 高24位必将补1,此时补码显然发生变化,在与上0xff,将高24重新置0,

    这样能保证补码的一致性,当然由于符号位发生变化,表示的十进制数就会变了

    1111 1111 1111 1111 1111 1111 1000 0001 
    
    &
    
    0000 0000 0000 0000 0000 0000 1111 1111
    
    结果是
    
    0000 0000 0000 0000 0000 0000 1000 0001
    

    和原来的补码 一致,但是显然符号位变化了,表示的十进制数发生变化,变为129

    结论:

    java中基本类型从小扩展到大的数据类型时候,正数因为符号位是0,无论如何都是补零扩展,但是负数补零扩展和补符号位扩展完全不同,

    负数补符号位扩展,保证十进制数不变

    例如 byte>>>int -127自动按照补符号位扩展,在高24位补符号位1,表示的十进制数不变

    补零扩展,保证补码的一致性,但是表示的十进制发生变化

    例如,本例中byte提升为int,&0xff的操作

    参考:byte为什么要&0xff

    展开全文
  • 浅谈 &0xFF操作

    千次阅读 2019-06-21 03:33:51
    在java.io.FilterOutputStream.DataOutputStream:与机器无关地写入各种类型的数据以及String对象的二进制形式,从高位开始写。这样一来,任何机器上任何DataInputStream都能够读取它们。所有方法都以“write”开头...

    在java.io.FilterOutputStream.DataOutputStream:与机器无关地写入各种类型的数据以及String对象的二进制形式,从高位开始写。这样一来,任何机器上任何DataInputStream都能够读取它们。所有方法都以“write”开头,例如writeByte(),writeFloat()等。

    java.io.FilterOutputStream.PrintStream最初的目的是为了以可视化格式打印所有的基本数据类型以及String对象。这和DataOutputStream不同,它目的是将数据元素置入“流”中,使DataInputStream能够可移植地重构它们。

    对于如何把一串字符串写成二进制,我一直迷惑不解,直到我看到下面的信息:

    字符串的本质是char的序列,也就是char [ ]。因此,遍历写入每一个char,就完成了写一个字符串的功能!

    那么问题又来了,如何把char写成二进制呢?

    英语字母有ASCII码,可以把每个字符转换成对应的数字,那么汉字呢,日语呢,韩语呢,泰国语呢????????????????????????????????????????????????????

    把心放肚子里吧,这个问题前人早就已经解决了。世界上的绝大部分字符都有一张类似于ASCII码表的字符和编码间的映射,那就是Unicode码表。看:

    Unicode 字符编码标准是固定长度的字符编码方案,它包含了世界上几乎所有现用语言的字符。有关 Unicode 的信息可在最新版本的 The Unicode Standard 一书中找到,并可从 Unicode 协会 Web 站点(www.unicode.org)中找到。 Unicode 根据要编码的数据类型使用两种编码格式:8 位和 16 位。缺省编码格式是 16 位,即每个字符是 16 位(两个字节)宽,并且通常显示为 U+hhhh,其中 hhhh 是字符的十六进制代码点。虽然生成的 65000 多个代码元素足以用于 编码世界上主要语言的大多数字符,但 Unicode 标准还提供了一种扩展机制,允许编码一百多万个字符。扩展机制使用一对高位和低位代用字符来对扩展字符或补充字符进行编码。第一个(或高位)代用字符具有 U+D800 和 U+DBFF 之间的代码值,而第二个(或低位)代用字符具有 U+DC00 和 U+DFFF 之间的代码值。

    unicode码真的可以用2个字节表示世界上的绝大部分字符。

    至此,当看到一个char时,我仿佛看到了它背后隐隐欲现的0-65535间的数字,当看到一个String时,我仿佛看到了一串数字!

    所以,DataOutputStream.writeChars(str)的源码也就明晰了

        public final void writeChars(String s) throws IOException {
                int len = s.length();
              
                for (int i = 0 ; i < len ; i++) {
                    int v = s.charAt(i);
                    out.write((v >>> 8) & 0xFF);
                    out.write((v >>> 0) & 0xFF);
                }
                incCount(len * 2);
            }


    所以除了要遍历一遍string之外,其他的操作Yu DataOutputStream.writeShort(v)的源码没什么区别

        public final void writeShort(int v) throws IOException {
                out.write((v >>> 8) & 0xFF);
                out.write((v >>> 0) & 0xFF);
                incCount(2);
            }

    至此,就把一串字符串写成二进制了。

    但是,你有没有一个疑问????????为什么(v >>> 8) & 0xFF ??为什么(v >>> 0) & 0xFF????不知道你有没有,反正我有。

    具体疑问:1 为什么要用无符号的右移? 2 &0xFF不会使数的大小改变,为什么还要 &0xFF?

    先科普一下:

    0(零)xFF是16进制的255,也就是二进制的 1111,1111

    & AND 按位与操作,同时为1时才是1,否则为0.

    ————位移运算计算机中存的都是数的补码,所以位移运算都是对补码而言的————

    << 左移 右补0

    >> 有符号右移 左补符号位,即:如果符号位是1 就左补1,如果符号位是0 就左补0

    >>>无符号右移 ,顾名思义,统一左补0

    ————————————————————————————————————————


    要想知道为什么?我们应该想想,我们的目的是干什么的?开始已经讲了:先取高8位写入,再写入低8位.。

    0000,0000,0000,0011     3的二进制原码,假设要写入的short字符对应的unicode码是3。

    0000,0000,0000,0000      这是">>>8"的结果                        

                              1111,1111       然后再 &0XFF                                                                         

                      0000,0000       最终结果                                                                                    

       这就得到了 3的原码0000,0000,0000,0011 的高8位。

        0000,0000,0000,0011        >>>0还是源码本身不变

                                  1111,1111        &0XFF                                                                       

                                0000,0011        最终结果
    这就得到了 3的原码0000,0000,0000,0011 的低8位。

    其实,用有符号的右移>>也一样得到高/低8位,因为右移操作不改变数本身,返回一个新值,就像String。所以 "&0xFF" 就像计算机中的一把剪刀,当‘&’操作符两边数的bit位数相同时不改变数的大小,只是专门截出一个字节的长度。同理,&0x0F呢?得到4bits
    ---------------------
    作者:鹰立如睡
    来源:CSDN
    原文:https://blog.csdn.net/LVGAOYANH/article/details/53486933
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • &0xFF 的意义

    千次阅读 2017-06-16 15:14:09
    今天看了下同事从网上拷贝的base64加密的代码,看到了这样如下的代码 public static String encode(byte[] data) { StringBuilder sb = new StringBuilder();... int i = 0; int b1, b2, b3; while (i
  • 关于&0xFF的理解

    千次阅读 2017-03-03 00:20:23
    &0xff
  • &0xFF是怎么个意思

    万次阅读 多人点赞 2017-04-28 19:05:24
    今天看了下同事从网上拷贝的base64加密的代码,看到了这样如下的代码 public static String encode(byte[] data) { StringBuilder sb = new StringBuilder();... int i = 0; int b1, b2, b3; while (i
  • ‘utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte觉得有用的话,欢迎一起讨论相互学习~Follow Me今天使用语句image_raw_data_jpg = tf.gfile.FastGFile('../test_images/test_1.jpg', 'r'...
  • toHexString(b[n] & 0XFF)为什么要和0XFF做与运算

    万次阅读 热门讨论 2016-08-23 14:24:58
    在32位的电脑中数字都是以32格式存放的,如果是一个byte(8位)类型的数字,高24位里面都是随机数字,低8位 ...方法会把这个数字的高24为也看作有效位,这就必然导致错误,使用& 0XFF操作,可以把高24位置0以避免这
  • 为何与0xff进行与运算

    千次阅读 2017-04-01 14:45:23
    为何与0xff进行与运算 在剖析该问题前请看如下代码 public static String bytes2HexString(byte[] b) { String ret = ""; for (int i = 0; i < b.length; i++) { String hex = Integer.toHexString(b[ i ...
  • Md5加密中为什么要 & 0xff

    千次阅读 2017-03-19 12:13:49
    《Md5加密中为什么要 & 0xff》 这里首先要搞明白一个代理(自己设想的):  * byte有8位,假如全部都是 11111111 那么对应的int(10进制)类型就是 255  * 虽然255(十进制)和11111111(二进制)都表示同一个数,但...
  • &0xff的原因

    千次阅读 2017-09-29 09:04:30
    &0xff的目的
  • Java中byte做&0xff运算的原因及解析

    千次阅读 2018-03-18 17:23:05
    0xff的原因及解析 网上瞎写的一大堆,实在是无语。把自己理解的整理分享给大家。 首先要知道原码、反码、补码是什么。可以参考: http://blog.csdn.net/u011080472/article/details/51280919 ...
  • 一开始开发django网站使用sqlite3,后期使用MySql开发,将sqlite3数据导出为data.json,再向MySql导入时报错:UnicodeDecodeError: utf-8 codec cant decode byte 0xff in position 0: invalid start byte。...
  • byte[i] & 0xFF原因(byte为什么要&上0xff?) 先来看一段代码: private String changeHex(byte[] bs){ char[] hexArray = "0123456789abcdef".toCharArray(); // 将字符串转换为一个字符数组 char[] ...
  • byte 为什么要 & 0xff

    千次阅读 2017-06-15 15:25:30
    在MD5运算中 通常会把MD5(十六进制的byte[])转成HexString, 会用到一个方法 private static String bytesToHex1(byte[] md5Array) { StringBuilder strBuilder = new ... for (int i = 0; i < md5Array.lengt
  • Java中0xff的作用(byte&0xff

    千次阅读 2017-12-14 15:42:37
    近几日研究加密算法,对于代码中byte&0xff甚是不解,于是乎查阅资料,下边以最简洁的理解记录之。在Java中int类型的变量声明为十六进制的形式比如: 例如:0xff表示十进制255(十六进制方式,格式为0x打头)具体来...
  • Java中为何与0xff进行与运算

    万次阅读 2015-12-09 12:41:03
    为何与0xff进行与运算 在剖析该问题前请看如下代码 public static String bytes2HexString(byte[] b) {  String ret = "";  for (int i = 0; i  String hex = Integer.toHexString(b[ i ] & 0xFF...
  • 其中有两个位运算,一个是>...十六进制0xff的长度是一个字节,即八位,二进制为:1111 1111,那么一个 8bit 数与1111 1111与运算还是这个数本身,但是一个16bit 数与 0xff就被截断了,比如 110...
  • & 0xFF的意思

    千次阅读 2017-12-27 08:46:35
    最近看见一段代码如下: public final short Red; public final short Green; public final short Blue; public ZLColor(int r, int g, int b) { Red = (short)(r & 0xFF); Green = (short)(g & 0
1 2 3 4 5 ... 20
收藏数 212,596
精华内容 85,038
关键字:

0xff