精华内容
下载资源
问答
  • 0xff) (b[i]为byte型,c[i]为char型)觉得与一下0xff没什么用。直接c[i] = (char)b[i]有何异?如: ((WORD)((((WORD)(wData) >> 8) & 0xff) | (((WORD)(wData) << 8) & 0xff00)))charc=(ch...

    c[i] = (char) (b[i] & 0xff) (b[i]为byte型,c[i]为char型)

    觉得与一下0xff没什么用。直接c[i] = (char)b[i]有何异?

    如: ((WORD)((((WORD)(wData) >> 8) & 0xff) | (((WORD)(wData) << 8) & 0xff00)))

    char c = (char)-1 & 0xFF;

    char d = (char)-1;

    System.out.println((int)c);

    System.out.println((int)d);

    这样输出是

    255

    65535

    上面代码就是为了避免错误

    补充一下:

    1)。位运算符只针对4byte的int型

    2)。-2的byte类型 16进制表示为 FE(2取反加1)

    3)。-2 & 0xFF运算: 实际-2带符合bit-wise成int,即FE会变成FFFFFFFE(2取反加1), 接着

    0xFFFFFFFE & 0x000000FF = 0x 000000FE; 如果不&,就是FFFFFFFE。

    1) 位运算不限制为int, long也行的。

    2)

    3) 负数进行&操作时需要转成补码,-2 的补码是0xFFFFFFFE

    因为byte的取值范围是 -128~127,而Char是0~65535

    所以需要& 0xFF 使得byte原来的负值变成正的

    展开全文
  • ‘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'...

    ‘utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte

    觉得有用的话,欢迎一起讨论相互学习~


    我的微博我的github我的B站

    今天使用语句

    image_raw_data_jpg = tf.gfile.FastGFile('../test_images/test_1.jpg', 'r').read()
    

    读取图片文件的时候遇到了以下问题:

    'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
    

    原因:

    0x92 即 10010010,UTF8 中编码一个字符的第一个字节(start byte)只可能是 0xxxxxxx、110xxxxx、1110xxx、11110xxx……而后面的字节只可能是 10xxxxxx。也就是说 0x92 只能作为后面的字节,却出现在了第一个字节的位置。

    出现这种问题绝大部分情况是因为文件不是 UTF8 编码的(例如,可能是 GBK 编码的),而系统默认采用 UTF8 解码。解决方法是改为对应的解码方式。

    极少数情况是因为文件损坏了或者和一部分非 UTF8 编码混在一起,可以修复文件或采用 replace 等方式解码。

    解决方案

    将’r’改为’rb’的形式,即:

    image_raw_data_jpg = tf.gfile.FastGFile('../test_images/test_1.jpg', 'rb').read()
    

    参考文献:

    https://segmentfault.com/q/1010000004268196

    展开全文
  • 详解 & 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”?拆分理解下0xFF是16进制的表达方式,F是15;十进制为:255,二进制为:1111 1111&运算符:如果2个bit都是1,则得1,否则得0然后开始百度……最后一路百度到计算机的原理之:原码、补码和反码,先简单讲...

    6138fcc4d14a360b673023e05f20266a.png

    每次遇到与或位移等运算总会懵圈一次,百度明白了之后就忘了,理解不够深刻,不够明确,工作中也很少写,所以记下

    1a356714b31d128ae90cb43611dc5b75.png

    2a9c3cb5964cb45b4ee4cf552d2f151c.png

    为什么要加上“& 0xFF”?

    拆分理解下

    0xFF是16进制的表达方式,F是15;十进制为:255,二进制为:1111 1111

    &运算符:如果2个bit都是1,则得1,否则得0

    然后开始百度……

    最后一路百度到计算机的原理之:原码、补码和反码,先简单讲下这三个词的意思吧!

    我们已经知道计算机中,所有数据最终都是使用二进制数表达。

    我们也已经学会如何将一个10进制数如何转换为二进制数。

    不过,我们仍然没有学习一个负数如何用二进制表达。

    比如,假设有一 int 类型的数,值为5,那么,我们知道它在计算机中表示为:

    00000000 00000000 00000000 00000101

    5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。

    现在想知道,-5在计算机中如何表示?

    在计算机中,负数以其正值的补码形式表达。

    什么叫补码呢?这得从原码,反码说起。

    原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。

    比如 00000000 00000000 00000000 00000101 是 5的 原码。

    反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

    取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)

    比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。

    称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。

    反码是相互的,所以也可称:

    11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互为反码。

    补码:反码加1称为补码。

    也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。

    比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。

    那么,补码为:

    11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011

    所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。

    再举一例,我们来看整数-1在计算机中如何表示。

    假设这也是一个int类型,那么:

    先取1的原码:00000000 00000000 00000000 00000001

    得反码: 11111111 11111111 11111111 11111110

    得补码: 11111111 11111111 11111111 11111111

    可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFFFF。

    上面这么多蛋疼的操作仅仅是因为:在计算机中,负数以其正值的补码形式表达。

    有的人可能会问:那为什么在计算机中,负数以其正值的补码形式表达?

    为什么负数以其正值的补码形式表达:说到补码,就不得不引人另一个概念——模数。模数从屋里意义上讲是某种计量器的容量。这里我们经常举的一个例子就是钟表,其模数为12,即每到12就重新从0开始,数学上叫取模或求余(mod),java、C#和C++里用%表示求余操作。例如:

    14%12=2

    如果此时的正确时间为6点,而你的手表指向的是8点,如何把表调准呢?有两种方法:一把表逆时针拨两个小时;二是把表顺时针拨10个小时,即

    8-2=6

    (8+10)%12=6

    也就是说在此模数系统里面有

    8-2=8+10

    这是因为2跟10对模数12互为补数。因此有一下结论:在模数系统中,A-B或A+(-B)等价于A+[B补],即

    8-2/8+(-2)=8+10

    我们把10叫做-2在模12下的补码。这样用补码来表示负数就可以将加减法统一成加法来运算,简化了运算的复杂程度。

    采用补码进行运算有两个好处,一个就是刚才所说的统一加减法;二就是可以让符号位作为数值直接参加运算,而最后仍然可以得到正确的结果符号,符号位无需再单独处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

    到这里估计大家都能大概了解原码、补码和反码了,我们回到一开始的问题。

    data[1] = (byte)(deY & 0xFF);

    外部传进来一个参数func,这个参数有可能是负数的,例如传进来一个“-12”,“-12”二进制为:

    0000 1100 取反: 1111 0011 补码加1: 1111 0100

    byte –> int 就是由8位变 32 位 高24位全部补1: 1111 1111 1111 1111 1111 1111 1111 0100 ;

    0xFF的二进制表示就是:1111 1111,高24位补0:0000 0000 0000 0000 0000 0000 1111 1111;

    -12的补码与0xFF 进行与(&)操作 最后就是:0000 0000 0000 0000 0000 0000 1111 0100

    最终保持“-12”取反码,补码加1的一致性。

    byte类型的数字要&0xff再赋值给int类型,其本质原因就是想保持二进制补码的一致性。

    当byte要转化为int的时候,高的24位必然会补1,这样,其二进制补码其实已经不一致了,&0xff可以将高的24位置为0,低8位保持原样。这样做的目的就是为了保证二进制数据的一致性。

    人,一定要靠自己

    展开全文
  • Opencv 中 waitkey()& 0xFF,“0xFF”的作用解释

    千次阅读 多人点赞 2020-02-06 15:31:11
    这几日学习OpenCV,刚碰到这个表达式时,对于0xFF的作用不太理解,难道下面两个语句还有区别?(Esc的ASCII码为27,即判断是否按下esc键) if cv2.waitkey(30)==27 if cv2.waitkey(30)&0xff==27 疑惑 首先&...
  • 十六进制0xff的长度是一个字节,即八位,二进制为:1111 1111,那么一个 8bit 数与1111 1111与运算还是这个数本身,但是一个16bit 数与 0xff就被截断了,比如 1100110011001100 & 0xff结果为 1...
  • Java中0xff的作用(byte&0xff

    千次阅读 2017-12-14 15:42:37
    近几日研究加密算法,对于代码中byte&0xff甚是不解,于是乎查阅资料,下边以最简洁的理解记录之。在Java中int类型的变量声明为十六进制的形式比如: 例如:0xff表示十进制255(十六进制方式,格式为0x打头)具体来...
  • 这几日学习OpenCV,刚碰到这个表达式时,对于0xFF的作用不太理解,难道下面两个语句还有区别?(Esc的ASCII码为27,即判断是否按下esc键) if cv2.waitkey(30)==27 if cv2.waitkey(30)&0xff==27 疑惑 首先&...
  • float使用0xFF

    2017-04-10 16:02:00
    1. float f = 0xFFFFFFFF; 这一句完全是错误的用法,它不会使f变量内存变为4个0xFF,因为0xFFFFFFFF根本就不是有效的float数值,编译器无从处理,如果用printf('%x'... unsigned char b[4] = {0xFF,0xFF,0xFF,0xEF}...
  • byte b = 0xff; 这样无法通过编译。 因为这时的0xff,是作为int类型的,其值为255, 二进制记作0000 0000 0000 0000 0000 0000 1111 1111,另外,JAVA这里的二进制是用补码的。 而byte的范围是-127~128,所以...
  • 这几日学习OpenCV,刚碰到这个表达式时,对于0xFF的作用不太理解,难道下面两个语句还有区别?(Esc的ASCII码为27,即判断是否按下esc键) if cv2.waitkey(30)==27 if cv2.waitkey(30)&0xff==27 疑惑 首先&...
  • (byte)0xaa 0xff

    千次阅读 2017-11-29 18:05:18
    byte aa= 0xff; 用int表示为-1 内存里的数是用补码存储的 正数的补码=正数本身 负数的补码=负数的绝对值按位取反后再加1 char duan定义的是一个字节的有符号数 0xff在内存中是11111111,最高位是1,说明是负数 按...
  • 0xff与“&”

    2020-11-24 14:50:34
    1. 0xff 0xff表示二进制1111 1111,十进制255 2.&:表示1与1的时候才等于1,其他都为0 表示与,计算:对应位置比较,来获取0还是1 3 & 0xff=? 先转为二进制:0000 0011 & 1111 1111=00000011;
  • &0xff的原因

    千次阅读 2017-09-29 09:04:30
    &0xff的目的
  • byte[i] & 0xFF原因(byte为什么要&上0xff?) 先来看一段代码: private String changeHex(byte[] bs){ char[] hexArray = "0123456789abcdef".toCharArray(); // 将字符串转换为一个字符数组 char[] ...
  • &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
  • &0xff?懂了!

    千次阅读 多人点赞 2020-04-16 22:11:28
    0xff 的操作一直处于疑惑状态. byte[i] 是8位二进制,0xff 转化成8位二进制就是 11111111,那么byte[i] & 0xff不是还是byte[i]本身吗?Are you kidding me? 对于这个问题, 我在网上看到一个demo很有趣: ...
  • toHexString(b[n] & 0XFF)为什么要和0XFF做与运算

    万次阅读 热门讨论 2016-08-23 14:24:58
    在32位的电脑中数字都是以32格式存放的,如果是一个byte(8位)类型的数字,高24位里面都是随机数字,低8位 ...方法会把这个数字的高24为也看作有效位,这就必然导致错误,使用& 0XFF操作,可以把高24位置0以避免这
  • 今天学到一句Integer.toHexString(b & 0xff)(b是byte类型的) 马克一下什么意思首先, 以下是java.lang.Integer.toHexString()方法的声明 public static String toHexString(int i) Integer.toHexString这个方法...
  • 关于&0xFF的理解

    千次阅读 2017-03-03 00:20:23
    &0xff
  • char,uchar,0xff

    2017-04-26 17:33:00
    如果:char test = 0xFF; 此时:test != 0xFF;//因为test为char类型,0xFF为int,所以编译器会将test转为int(-1),所以不等于 如果:uchar test = 0xFF; 此时:test == 0xFF;//同样因为test为uchar...
  • ?_=${%ffffffff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo
  • 0xff打印

    2010-10-19 15:53:00
    原程序 char c = 0xff; cout(int)c; 结果: 0xffffffff 修改后程序: unsigned char c = 0xff; cout(unsigned int)c; 结果: 0xff 原因是0xff二进制是...
  • 0xff转十进制

    千次阅读 2016-03-31 12:22:41
    以0x开头的数据表示十六进制,在十六进制中,A、B、C、D、E、F这五个字母分别表示10、11、12、13、14、15,0xff换成十进制为255。0xff=15*16^1+15*16^0=240+15=2550xff转二进制再转十进制: 0xff=11111111=2^8-1=...
  • 为什么需要用&0xFF

    2017-11-29 11:33:37
    & 0xFF

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,091,969
精华内容 436,787
关键字:

0xff