Skip to content

Instantly share code, notes, and snippets.

@johnrcui
Created November 5, 2024 05:02
Show Gist options
  • Select an option

  • Save johnrcui/063a1e55720bbdb9b6bc8a9ca9dd206d to your computer and use it in GitHub Desktop.

Select an option

Save johnrcui/063a1e55720bbdb9b6bc8a9ca9dd206d to your computer and use it in GitHub Desktop.
MySQL bitwise operations on hex and binary data
DELIMITER $$
DROP FUNCTION IF EXISTS hex_or_hex;
CREATE FUNCTION IF NOT EXISTS hex_or_hex (
h1 TEXT,
h2 TEXT
)
RETURNS TEXT
COMMENT 'Perform a bitwise OR operation between two hex values'
DETERMINISTIC
BEGIN
DECLARE h CHAR(16) DEFAULT '0123456789ABCDEF';
DECLARE t TEXT
DEFAULT '0123456789ABCDEF1133557799BBDDFF23236767ABABEFEF33337777BBBBFFFF45674567CDEFCDEF55775577DDFFDDFF67676767EFEFEFEF77777777FFFFFFFF89ABCDEF89ABCDEF99BBDDFF99BBDDFFABABEFEFABABEFEFBBBBFFFFBBBBFFFFCDEFCDEFCDEFCDEFDDFFDDFFDDFFDDFFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFF';
DECLARE c INTEGER DEFAULT 1;
DECLARE r TEXT DEFAULT '';
IF LENGTH(h1) > LENGTH(h2) THEN
SET h2 = LPAD(h2, LENGTH(h1), '0');
ELSEIF LENGTH(h2) > LENGTH(h1) THEN
SET h1 = LPAD(h1, LENGTH(h2), '0');
END IF;
REPEAT
SET r = CONCAT(
r,
SUBSTR(
t,
((POSITION(SUBSTR(h1, c, 1) IN h) - 1) * 16) + POSITION(SUBSTR(h2, c, 1) IN h),
1
)
);
SET c = c + 1;
UNTIL c > LENGTH(h1)
END REPEAT;
RETURN r;
END;
$$
DELIMITER ;
DELIMITER $$
DROP FUNCTION IF EXISTS hex_and_hex;
CREATE FUNCTION IF NOT EXISTS hex_and_hex (
h1 TEXT,
h2 TEXT
)
RETURNS TEXT
COMMENT 'Perform a bitwise AND operation between two hex values'
DETERMINISTIC
BEGIN
DECLARE h CHAR(16) DEFAULT '0123456789ABCDEF';
DECLARE t TEXT
DEFAULT '00000000000000000101010101010101002200220022002201230123012301230000444400004444010145450101454500224466002244660123456701234567000000008888888801010101898989890022002288AA88AA0123012389AB89AB000044448888CCCC010145458989CDCD0022446688AACCEE0123456789ABCDEF';
DECLARE c INTEGER DEFAULT 1;
DECLARE r TEXT DEFAULT '';
IF LENGTH(h1) > LENGTH(h2) THEN
SET h2 = LPAD(h2, LENGTH(h1), '0');
ELSEIF LENGTH(h2) > LENGTH(h1) THEN
SET h1 = LPAD(h1, LENGTH(h2), '0');
END IF;
REPEAT
SET r = CONCAT(
r,
SUBSTR(
t,
((POSITION(SUBSTR(h1, c, 1) IN h) - 1) * 16) + POSITION(SUBSTR(h2, c, 1) IN h),
1
)
);
SET c = c + 1;
UNTIL c > LENGTH(h1)
END REPEAT;
RETURN r;
END;
$$
DELIMITER ;
DELIMITER $$
DROP FUNCTION IF EXISTS hex_xor_hex;
CREATE FUNCTION IF NOT EXISTS hex_xor_hex (
h1 TEXT,
h2 TEXT
)
RETURNS TEXT
COMMENT 'Perform a bitwise XOR operation between two hex values'
DETERMINISTIC
BEGIN
DECLARE h CHAR(16) DEFAULT '0123456789ABCDEF';
DECLARE t TEXT
DEFAULT '0123456789ABCDEF1032547698BADCFE23016745AB89EFCD32107654BA98FEDC45670123CDEF89AB54761032DCFE98BA67452301EFCDAB8976543210FEDCBA9889ABCDEF0123456798BADCFE10325476AB89EFCD23016745BA98FEDC32107654CDEF89AB45670123DCFE98BA54761032EFCDAB8967452301FEDCBA9876543210';
DECLARE c INTEGER DEFAULT 1;
DECLARE r TEXT DEFAULT '';
IF LENGTH(h1) > LENGTH(h2) THEN
SET h2 = LPAD(h2, LENGTH(h1), '0');
ELSEIF LENGTH(h2) > LENGTH(h1) THEN
SET h1 = LPAD(h1, LENGTH(h2), '0');
END IF;
REPEAT
SET r = CONCAT(
r,
SUBSTR(
t,
((POSITION(SUBSTR(h1, c, 1) IN h) - 1) * 16) + POSITION(SUBSTR(h2, c, 1) IN h),
1
)
);
SET c = c + 1;
UNTIL c > LENGTH(h1)
END REPEAT;
RETURN r;
END;
$$
DELIMITER ;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment