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

Python 3.x 提取最低有效位-为什么%运算符相关?,python-3.x,steganography,Python 3.x,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])

我需要帮助来理解下面的代码,我在解释隐写术和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)
枚举(数据)中i,x的
:
如果计数器
模运算符用于计算整数除法的余数。例如,对于递增的
i
i%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==0
i%11==0
很少为真,因此您将把其余的大部分位嵌入蓝色。其中只有大约十分之一会变成绿色(特别是当
i
为5、15、25、…)时)


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

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

好的,如果你选择一个2^n的数字,你将返回n个最低有效位,通常这是通过
按位和
和掩码来完成的,例如

m%4
(m%2**2)
将返回最低有效位2;在0-3(含)范围内


这与类似于
m&3
。。。ie
m&(2**n)-1在我看来,原始代码并没有完全在位线上拆分。可能是故意的,可能是个bug。幸运的是,不需要回答他们如何选择常数来回答为什么使用相关运算符的问题。虽然你回答了粗体的问题,模运算符确实可以这样使用,但这是OP提出的一个有点误导的问题,因为他不理解代码。在这里,操作符不是直接用于嵌入/提取,而是作为一个好的ol'分支用于哪个颜色平面进行嵌入。