提取最低有效位 - 为什么%运算符相关?

时间:2015-12-22 00:09:08

标签: python-3.x steganography

我需要帮助才能理解下面的代码,我在解释有关Steganography和LSB的教程中找到了这些代码。但是,我无法理解代码编写器为什么使用模运算符(%)。例如,要在红色像素中插入新数据,他使用% 2表示绿色% 5 } 等等。代码的片段如下:

for i, x in enumerate(data): 
        if counter < len(message_bit):
            if i % 2 == 0:
                r= int(str("{0:b}".format(x[0]))[:-1] + message_bit[counter], 2) # red
                x = (r, x[1], x[2])
                counter += 1

            elif i % 5 == 0:
                g = int(str("{0:b}".format(x[1]))[:-1] + message_bit[counter], 2) # green
                x = (x[0], g, x[2])
                counter += 1

            elif i % 11 == 0:
                pass

            else:
                b = int(str("{0:b}".format(x[2]))[:-1] + message_bit[counter], 2) #blue
                x = (x[0], x[1], b)
                counter += 1

        new_data.append(x)

2 个答案:

答案 0 :(得分:0)

模运算符用于计算整数除法的余数。例如,对于递增ii % 3会给出循环结果0,1,2,0,1,2等。传统方法是使用此循环关系嵌入一点在不同的颜色平面。

if i % 3 == 0:
    # embed in the red
elif i % 3 == 1:
    # embed in the greed
else:
    # embed in the blue

虽然此代码的作者做出了同样的决定,但结果显示没有明确的模式,并且嵌入在所有色彩平面上都不一致。

i = 0
    i % 2 == 0 is true  -> embed in RED
i = 1
    i % 2 == 0 is false
    i % 5 == 0 is false
    i % 11 == 0 is false
    else                 -> embed in BLUE
i = 2
    same as i = 0        -> embed in RED
i = 3
    same as i = 1        -> embed in BLUE
i = 4
    same as i = 0        -> embed in RED
i = 5
    i % 2 == 0 is false
    i % 5 == 0 is true   -> embed in GREEN

continuing with this logic....

i = 6                    -> embed in RED
i = 7                    -> embed in BLUE
i = 8                    -> embed in RED
i = 9                    -> embed in BLUE
i = 10                   -> embed in RED
i = 11                   -> SKIP

and so on and so forth

由于每个其他i都是偶数,因此您将一半的位嵌入红色。由于i % 5 == 0i % 11 == 0很少是真的,因此您将其余部分的大部分嵌入蓝色中。只有大约1/10的人会变成绿色(特别是i为5,15,25,......)。

我不知道你在哪里找到这个代码,但在我能找到它的唯一地方,海报没有解释。所以人们只能猜测这种奇怪模式的选择。然而,基于其余代码的质量,我发现作者可能误解了他应该做什么,这导致了这种奇怪的模式。嵌入和提取程序都遵循逻辑的事实意味着程序有效并且作者没有想到过去。

答案 1 :(得分:0)

提取最低有效位 - 为什么%运算符相关?

好吧,如果您选择一个2 ^ n的数字,您将返回n个最低有效位,通常用bitwise and和掩码完成,例如......

m % 4(m % 2**2)将返回最不重要的2位;在0-3范围内的范围内。

这与m & 3 ... m & (2**n)-1

相同