Вот схема одного из способов сделать это для битовых операций без смещения (но может быть лучше написать собственный плагин, чтобы сделать это напрямую):
- Разделите входную шестнадцатеричную строку шириной 32 символа на 4 отдельные строки шириной 8 символов. Аналогично разделите другой операнд (также предполагается, что это входная шестнадцатеричная строка шириной 32 символа).
- Используйте apoc.convert.toInteger , чтобы преобразовать каждую шестнадцатеричную строку шириной 8 символов (после каждого префикса с "0x") в целое число.
- Выполнить побитовую операцию для каждой соответствующей пары целых чисел.
- Используйте apoc.text.hexValue , чтобы преобразовать каждый целочисленный результат обратно в шестнадцатеричный формат и предварительно добавить достаточно «0» символов вперед, чтобы получить ширину 8 символов.
- Объединить 4 шестнадцатеричные строки обратно в одну шестнадцатеричную строку шириной 32 символа.
В Cypher, предполагая, что входная шестнадцатеричная строка шириной 32 символа, побитовая операция (например, '|') и другой операнд передаются как параметры $input
, $operation
и $operand
:
WITH [i IN RANGE(0, 24, 8) |
"0000000" + apoc.text.hexValue(
apoc.bitwise.op(
apoc.convert.toInteger("0x" + SUBSTRING($input, i, 8)),
$operation,
apoc.convert.toInteger("0x" + SUBSTRING($operand, i, 8))))
] AS x
RETURN REDUCE(r = "", s IN x | r + SUBSTRING(s, LENGTH(s)-8)) AS res;
Фактически, все вышеперечисленное можно сделать одним кратким предложением:
RETURN REDUCE(r = "",
s IN [i IN RANGE(0, 24, 8) |
"0000000" + apoc.text.hexValue(
apoc.bitwise.op(
apoc.convert.toInteger("0x" + SUBSTRING($input, i, 8)),
$operation,
apoc.convert.toInteger("0x" + SUBSTRING($operand, i, 8))))] |
r + SUBSTRING(s, LENGTH(s)-8)
) AS res;