4

我想用 KEY 对字符串(实际上是它的二进制表示)进行按位异或。

运算结果应以 HEX 表示。

我所拥有的:'a' - 要更改的 UTF-8 字符串。'ACF123456' - 十六进制的键。

结果被视为 BIGINT:

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

结果显示为十六进制:

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

问题:

  1. 上面的转换是否正确完成?
  2. 如果字符串太长会发生什么(即,我们有 'a veeeeeery long string' 而不是 'a')?似乎 conv() 函数有一个限制(它是文档中的 64 位精度)吗?除了 XOR 运算符之外,^ 也有一个限制,与 nr 相关。返回结果的位数。任何适用于任何字符串的解决方案(允许存储过程)?

谢谢。

4

1 回答 1

1

你的转换对我来说很好。正如您所指出的,两者CONV()^确实具有 64 位精度。

2^64 = 16^16,因此超过 16 个十六进制数字的字符串转换为大于 2^64 的整数。然而,当试图将它们转换为整数时,这些字符串将被从左边粗暴地(无声地)截断。

我的解决方案的重点是对这些字符串进行切片。显然,结果可能不会显示为整数,而仅显示为字符串表示。

@input 成为您的“要更改的字符串”和 @key的“关键”。

  1. 分配HEX(@input)@hex_input。这里没问题,因为HEX()可以使用字符串。
  2. @hex_input从右边开始,切成 16 位十六进制数字长字符串
  3. 同样,切成@key16 位长的字符串。
  4. 从右侧开始,用的每个 64 位切片计算 的X-OR每个 64 位切片的。使用. 如果其中一个或具有比另一个字符串少的切片,则另一个字符串的剩余切片为 0。@hex_input@keyCONV(@slice, 16, 10)@hex_input@keyX-OR
  5. 将 in 点 4. 中产生的每个 64 位数字转换X-OR回带有 . 的十六进制字符串UNHEX()
  6. 重新组装生成的切片。这是你的结果。

TEMPORARY列表可以用作一个数组来存储 的切片@hex_input@mask生成的切片。

把这一切放在一个存储过程中,

You sound like you have some skills in MySQL, you should be able to translate the above into real code. But I'll be happy to help if you need further guidance.

于 2012-06-21T21:09:00.330 回答