【问题标题】:Getting/Setting a bit value from image从图像中获取/设置位值
【发布时间】:2014-02-16 03:10:36
【问题描述】:

问题基于此site

谁能解释一下这几行的意思:

private int getBitValue(int n, int location) {
      int v = n & (int) Math.round(Math.pow(2, location));
      return v==0?0:1;
 }

private int setBitValue(int n, int location, int bit) {
    int toggle = (int) Math.pow(2, location), bv = getBitValue(n, location);
    if(bv == bit)
        return n;
    if(bv == 0 && bit == 1)
        n |= toggle;
    else if(bv == 1 && bit == 0)
        n ^= toggle;
    return n;
}

【问题讨论】:

    标签: java embed decode steganography


    【解决方案1】:

    getBitValue 只是获取指定位的值(在某个位置)

    setBitValue 在匹配的特定位置设置位的值。

    这些 getter/setter 方法通常用于图像处理,即如果你有一个麝香并且你想改变一个特定的位值。

    不多也不少。

    【讨论】:

    • 抱歉没有说清楚。我想知道这两种方法中每一行的含义,以及为什么setBitValue(int n, int location, int bit)需要再做getBitValue(n, location);
    【解决方案2】:
      int v = n & (int) Math.round(Math.pow(2, location));
    

    Math.pow(2, location) 将 2 提高到给定的幂。这是四舍五入并转换为整数。在二进制中,如果location==0,这将是00000001,如果location==1,则为00000010,如果location==2,则为00000100,等等(更好的是1 << location,它将“1”移动一定数量的位,填充0右边的位。使用Math.pow 可能会在每次调用时尝试计算 2 的对数。)

    n & ... 是按位与。由于右边的项目只设置了一位,因此效果是将n 中除该一位之外的每一位清零,并将结果放入v。这意味着如果n 中的一位为0,则v 将为0,如果该位为`,则为非0,这意味着

      return v==0?0:1;
    

    如果该位清零,则返回 0,如果已设置,则返回 1。

    int toggle = (int) Math.pow(2, location), bv = getBitValue(n, location);
    

    toggle 设置为我已经描述的Math.powbv 设置为 n 中已有的位,即 0 或 1。如果这等于您设置的值,那么我们不需要对 n 执行任何操作:

    if(bv == bit)
        return n;
    

    否则,我们需要将其设置为 1(请记住,toggle 将只设置一个位)。 n |= togglen = n | toggle 相同。 | 是按位或,因此n 中的一位将被设置,n 中的所有其他位将保持不变"

    if(bv == 0 && bit == 1)
        n |= toggle;
    

    或者我们需要将该位设置为 0。n ^= togglen = n ^ toggle 相同。 n 是异或。如果我们到达这里,那么n 中的位为1,toggle 中的位为1,我们想将n 中的位设置为0,所以异或将在离开时将该位更改为0其他一点都一样:

    else if(bv == 1 && bit == 0)
        n ^= toggle;
    

    【讨论】:

    • 解释得很清楚。我需要回去再看一遍代码,并尝试理解它。谢谢大家。
    • 为什么setBitValue(int n, int location, int bit)方法中需要再做一次getBitValue,而这次使用的是rgb值但消息长度。
    • @JarekHuang 这就是他们实现它的方式。设置位值,该算法获取当前位值,然后看三种不同的情况:(1)当前位值=期望值,什么都不做; (2) 当前值为0,期望=1; (3) 当前值为 1,期望 = 0。有一些方法可以在不使用 getBitValue 的情况下完成此操作:例如,result = (n & ~toggle) | ((bit == 1) ? toggle : 0)
    猜你喜欢
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多