zoukankan      html  css  js  c++  java
  • 读取BMP图像size的时候与操作和左移的原因

    在读取一个bmp图像的时候,我们会将它的大小读取出来,如果还不清楚bmp的文件结构,那就先看一下这篇博客

    看完我将假设你已经明白所表示的意义。那么,对于bfSize, 它的表示数字为 50 00 00 00. 根据PC的显示习惯(其实就是小端存储规则),那么其真实值应该是00 00 00 50。 那么如果现在我们要提取出这个值,我们应该怎么做呢? 首先当然是将值从文件提取出来,这个简单,只需要将0-5的数据读取出来就可以了。假设读取出来的数据是放到一个数组sizeinfo里面的,那么现在sizeinfo[2]~sizeinfo[5]的数字就是我们想要的。

    那么要怎么组合成一个数字呢?按照我们一般的想法,应该是 0*16^7 + 0*16^6 + 0*16^5 + 0*16^4 + 0*16^3 + 0*16^2 + 5*16^1 + 0*16^0.

    那如果我们要这么计算的话是不是还要将50这样的数字解析成 5 和 0 呢?其实不用的。很明显用位操作可以简单完成工作。我们可以看看这份测试                                 

    在这个测试里面,我假设原数字为 51 00。那么真实值应该为: 5*16^3 + 1*16^2. 在51里面,5其实是比1高一位的,那也就是说,我们只要关心1,而5自动会比1高一位。而对于1来说,16^2其实就是左移8位。所以我们只需要将51左移8位,这个时候因为5本身是高位,所以左移后它的值就是5*16^3。

    所以综合起来,上图的bfSize就可以表示成如下:

    1 intbfSize = (int) (byteList[5] << 24)
    2                 | (byteList[4] << 16)
    3                 | (byteList[3] << 8)
    4                 | (byteList[2]);

    为什么是或操作呢?左移的时候,低位补的是0,而我们要把高位低位移位后的值加起来,其实也就是将对应的位给加上去。我们假设这样一个数字:51 01,那么应该是这样的:

                                

    那么,就是取或操作嘛。这样就能直接将低位的值加到高位后面了。

    那么是这样就完成了吗?当然不是,从我推荐的那篇博客的介绍可以看出,图像里面储存的数值是用 byte 类型的。也就是 8 位。而 int 是32位的。另外,在java里面二进制采用的是补码的形式。

    现在我们假设这样一个数字:0xff,这个时候因为我们表示图片 size 的时候是16进制,那么0xff 的实际值就不应该是 -1. 但是如果我们直接强制类型转换会怎样?java 会将0xff 当成 -1.然后位扩展成1111 1111 1111 1111 1111 1111 1111 1111. 也就是 0xffffffff。这个显然不是我们想要的。虽然在十进制数值的角度来说应该这个值才是-1.但我们首先要注意到这里我们不是用的十进制。

    那么也就是说,我们要的只是转换后的低八位的值。所以我们用 0xff 对转换的数字进行与操作。这样我们就能把低八位的数值保存下来而不受Java转换的影响。代码如下:

    return (((int)byteList[5] & 0xff) << 24)
                | ((int)(byteList[4] & 0xff) << 16)
                | ((int)(byteList[3] & 0xff) << 8)
                | ((int)(byteList[2] & 0xff));
  • 相关阅读:
    windows server2012之部署HTTPS安全站点
    HTTPS站点搭建教程:Win7/Windows Server 2008R2
    https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
    SQL Server中解决死锁的新方法介绍
    WCF寄宿到Windows Service[1]
    安装程序工具 (Installutil.exe)22
    安装程序工具 (Installutil.exe)
    WebSocket使用教程
    深入理解java String 对象的不可变性
    Android 给Button加个监听
  • 原文地址:https://www.cnblogs.com/xiezhw3/p/3902534.html
Copyright © 2011-2022 走看看