我想用一个KEY对一个字符串(实际上是它的二进制表示)进行Bitwise-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);
问题:
感谢。
答案 0 :(得分:1)
您的转化对我来说很好看。
正如您所指出的,CONV()
和^
确实具有64位精度。
2 ^ 64 = 16 ^ 16,因此超过16个十六进制数字的字符串应转换为大于2 ^ 64的整数。但是,当尝试将这些字符串转换为整数时,这些字符串将从左侧被残忍地(无声地)截断。
我在这里的解决方案是切片这样的字符串。显然,结果可能不会显示为整数,而只能显示为字符串表示。
让 @input
成为您的“要更改的字符串”和 @key
,您的“密钥”。
HEX(@input)
分配给@hex_input
。这里没问题,因为HEX()
适用于字符串。@hex_input
切成16个十六进制数字长字符串
@key
切成16位长字符串。X-OR
的每个64位切片的@hex_input
和每个64位切片@key
。使用CONV(@slice, 16, 10)
。如果@hex_input
或@key
的切片少于其他字符串,则X-OR
另一个字符串的剩余切片为0。X-OR
生成的每个64位数字转换回带UNHEX()
的十六进制字符串。可以将三列TEMPORARY
表用作数组来存储@hex_input
,@mask
的切片以及生成的切片。
将所有这些放在一个存储过程中,然后voilà!
你听起来像是在MySQL中有一些技巧,你应该能够将上述内容翻译成真正的代码。但如果您需要进一步的指导,我将很乐意为您提供帮助。