我需要帮助才能理解下面的代码,我在解释有关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)
答案 0 :(得分:0)
模运算符用于计算整数除法的余数。例如,对于递增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
很少是真的,因此您将其余部分的大部分嵌入蓝色中。只有大约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