Python 3.x 提取最低有效位-为什么%运算符相关?
我需要帮助来理解下面的代码,我在解释隐写术和LSB的教程中找到了这些代码。但是,我不明白为什么代码编写器使用模运算符(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])
%
)。例如,为了在红色像素中插入新数据,他使用了%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
。。。iem&(2**n)-1在我看来,原始代码并没有完全在位线上拆分。可能是故意的,可能是个bug。幸运的是,不需要回答他们如何选择常数来回答为什么使用相关运算符的问题。虽然你回答了粗体的问题,模运算符确实可以这样使用,但这是OP提出的一个有点误导的问题,因为他不理解代码。在这里,操作符不是直接用于嵌入/提取,而是作为一个好的ol'分支用于哪个颜色平面进行嵌入。