4

KEY を使用して文字列 (実際にはそのバイナリ表現) を Bitwise-XOR したいと考えています。

演算の結果は HEX で表す必要があります。

私が持っているもの: 'a' - 変更する UTF-8 文字列。'ACF123456' - HEX のキー。

BIGINT として表示される結果:

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

16 進数として表示される結果:

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

質問:

  1. 上記の変換は正しく行われていますか?
  2. 文字列が長すぎる場合 (つまり、'a' の代わりに 'a veeeeeery long string' がある場合) はどうなりますか? conv() 関数には制限があるようです (ドキュメントからの 64 ビット精度ですか)? また、XOR 演算子 ^ には、nr に関連する制限もあります。返された結果のビット数。任意の文字列で機能するソリューションはありますか (ストアド プロシージャは許可されています)?

ありがとう。

4

1 に答える 1

1

あなたの変換は私にはうまく見えます。ご指摘のとおり、 と の両方が実際に 64 ビットの精度CONV()を持っています。^

2^64 = 16^16 であるため、16 桁を超える文字列は2^64 より大きい整数に変換する必要があります。ただし、そのような文字列は、整数に変換しようとすると、残忍に (静かに) 左から切り捨てられます。

ここでの私の解決策のポイントは、そのような文字列をスライスすることです。明らかに、結果は整数として表示されず、文字列表現としてのみ表示される場合があります。

@input あなたの「変更する文字列」と @keyあなたの「鍵」にしましょう。

  1. に割り当てHEX(@input)ます@hex_input。文字列で動作するため、ここでは問題ありませんHEX()
  2. @hex_input右から 16 桁の 16 進数の長い文字列にスライスします。
  3. 同様に、@key16 桁の長い文字列にスライスします。
  4. X-ORの各 64 ビット スライスの を、 の@hex_input各 64 ビット スライスで@key右から計算します。を使用しCONV(@slice, 16, 10)ます。またはのスライスが他の文字列よりも少ない場合、他の文字列@hex_inputの残りのスライスは 0 になります。@keyX-OR
  5. X-ORポイント 4. で得られた各 64 ビット数値を . で 16 進数文字列に変換しUNHEX()ます。
  6. 結果のスライスを再構築します。これがあなたの結果です。

3 列のテーブルは、のスライスと結果のスライスTEMPORARYを格納する配列として使用できます。@hex_input@mask

これをすべてストアド プロシージャにまとめてください

あなたは MySQL のスキルをお持ちのようですが、上記を実際のコードに変換できるはずです。ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-06-21T21:09:00.330 に答える