2012-06-13 52 views
4

我想Bitwise-XOR與KEY的字符串(實際上是它的二進制表示)。Mysql:xor與鍵的字符串

該操作的結果應該表示爲HEX。

我有: 'a' - 要更改的UTF-8字符串。 'ACF123456' - HEX中的鑰匙。

結果視爲BIGINT:

select CONV(HEX('a'), 16, 10)^CONV('ACF123456', 16, 10); 

結果視爲HEX:

select CONV(CONV(HEX('a'), 16, 10)^CONV('ACF123456', 16, 10), 10, 16); 

問題:

  1. 是轉換上面做得正確?
  2. 如果字符串太長會發生什麼(即,而不是'我'有一個veeeeeery長字符串')?看來conv()函數有一個限制(它是文檔中的64位精度)?除了異或運算符^還有一個與nr有關的限制。返回結果的位數。任何適用於任何字符串的解決方案(允許存儲過程)?

謝謝。

回答

1

您的轉換對我來說看起來很好。 正如你所指出的,CONV()^確實有64位的精度。

2^64 = 16^16,因此超過16個十六進制數字的字符串應將轉換爲大於2^64的整數。然而,當試圖將它們轉換爲整數時,這樣的字符串將被殘忍地(無聲地)從左邊截斷。

我在這裏的解決方案的重點是切片這樣的字符串。顯然,結果可能不會顯示爲整數,而只能作爲字符串表示形式顯示。

@input是你的 「的字符串被改變」 和@key你的 「關鍵」。

  1. 分配HEX(@input)@hex_input。這裏沒問題,因爲HEX()與字符串一起工作。
  2. 切片@hex_input成16個十六進制數字長串,從右側
  3. 同樣,切片@key開始到16位長的字符串。
  4. 計算@hex_input的每個64位切片的X-OR,每個64位切片@key從右邊開始。使用CONV(@slice, 16, 10)。如果任一@hex_input@key具有比其它串少的切片,然後用0
  5. 另一字符串的X-OR剩餘切片轉換從X-OR在點4所產生的每個64位數字回一個十六進制字符串與UNHEX()
  6. 重組產生的切片。這是你的結果。

的三列TEMPORARY表可作爲數組存儲的@hex_input@mask切片,將所得切片。

把這一切放到一個存儲過程中,並且voilà

你聽起來像你有一些MySQL技能,你應該能夠將上面的代碼翻譯成真實的代碼。但如果您需要進一步的指導,我會很樂意提供幫助。