2015-12-22 47 views
-1

我需要幫助來理解下面的代碼,我在一個教程解釋關於隱寫和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

我看來像原來的代碼是不是位線正好分裂。可能是意圖,可能是一個錯誤。幸運的是,不需要回答他們如何選擇常量來回答爲什麼使用相關操作符的問題。 –

+1

[鏈接](http://tkmr.hatenablog.com/entry/2014/07/28/223854)到上下文的整個代碼。 – Reti43

回答

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,...)。

我不知道你在哪裏找到這段代碼,但在我能找到它的唯一地方,海報沒有任何解釋。所以人們只能猜測這個怪異模式的選擇。但是,根據其他代碼的質量,我發現作者可能誤解了他應該做的事情,這導致了這種奇怪的模式。嵌入和提取例程遵循邏輯的事實意味着程序起作用,作者沒有想到過去。

0

提取最低有效位 - 爲什麼%運算符是相關的?

好,如果你選擇一個數字,2^n您將返回至少顯著位,這通常是指與bitwise and做了n和口罩如...

m % 4(m % 2**2)將返回至少有意義的2位;在0-3範圍內。

這是一樣的像m & 3 ...即m & (2**n)-1

+0

雖然你確實回答粗體問題,模運算符的確可以這樣使用,但是由於他不瞭解代碼,所以從OP看來這是一個有點令人誤解的問題。這裏,操作符不是直接用於嵌入/提取,而是作爲一個很好的分支,爲其執行嵌入的顏色平面。 – Reti43

相關問題