我想用一个 KEY 对一个字符串(实际上是它的二进制表示)进行按位异或。
运算结果应以十六进制表示。
我有: 'a' - 要更改的 UTF-8 字符串。 'ACF123456' - 十六进制 key 。
结果被视为 BIGINT:
select CONV(HEX('a'), 16, 10) ^ CONV('ACF123456', 16, 10);
结果被视为十六进制:
select CONV( CONV(HEX('a'), 16, 10) ^ CONV('ACF123456', 16, 10), 10, 16);
问题:
- 上面的转换是否正确完成?
- 如果字符串太长会发生什么情况(即我们使用的不是“a”,而是“一个非常长的字符串”)?似乎 conv() 函数有一个限制(它是文档中的 64 位精度)?除了 XOR 运算符 ^ 也有一个限制,与 nr 相关。返回结果的位。任何适用于任何字符串的解决方案(允许存储过程)?
谢谢。
最佳答案
我认为您的转化效果不错。
正如你所指出的,CONV()
和 ^
确实有 64 位精度。
2^64 = 16^16,因此超过 16 个十六进制数字的字符串应该转换为大于 2^64 的整数。但是,当尝试将此类字符串转换为整数时,此类字符串将被从左侧粗暴地(无声地)截断。
我这里的解决方案的要点是对这些字符串进行切片。显然,结果可能不会显示为整数,而只能显示为字符串。
让 @input
成为您的“要更改的字符串”, @key
,您的“ key ”。
- 将
HEX(@input)
分配给@hex_input
。这里没问题,因为HEX()
可以处理字符串。 - 将
@hex_input
切成16进制长串,从右边开始 - 同样,将
@key
切成16 位长字符串。 - 计算
@hex_input
的每个 64 位切片与@key
的每个 64 位切片的X-OR
,从正确的。使用CONV(@slice, 16, 10)
。如果@hex_input
或@key
的切片比另一个字符串少,则将另一个字符串的剩余切片与 0 进行异或
。 - 使用
UNHEX()
将第 4 点中的X-OR
生成的每个 64 位数字转换回十六进制字符串。 - 重新组合生成的切片。这是你的结果。
一个三列的 TEMPORARY
表可以用作一个数组来存储 @hex_input
、@mask
的切片和结果切片。
将所有这些放在一个存储过程中,瞧!
你听起来像是在 MySQL 方面有一些技能,你应该能够将以上内容翻译成实际代码。但如果您需要进一步的指导,我很乐意提供帮助。
关于Mysql:用键对字符串进行异或,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11015628/