获取/设置图像的位值

时间:2014-01-24 23:20:19

标签: java embed decode steganography

问题基于此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;
}

2 个答案:

答案 0 :(得分:2)

  int v = n & (int) Math.round(Math.pow(2, location));

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

n & ...是一个按位AND。由于右侧的项只有一位设置,因此效果是将n中的每个位置零,除了那一位,并将结果放在v中。这意味着如果v中的一位为0,则n将为0,如果该位为“,则{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.如果这等于你设置它的那个,那么我们不需要对{{1 }}:

n

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

n

或者我们需要将该位设置为0. if(bv == 0 && bit == 1) n |= toggle; n ^= toggle相同。 n = n ^ toggle是一个异或。如果我们到达此处,则n中的位为1,n中的位为1,我们希望将toggle中的位设置为0,因此异或将更改该位为0,同时使其他位保持不变:

n

答案 1 :(得分:1)

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

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

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

没有更多或更少。