Как работает функция HEXTORAW()? Каков алгоритм?

HEXTORAW — это функция, встречающаяся в нескольких СУБД, таких как Oracle, и DB2 на LUW. Он принимает символ или целое число и в основном приводит его к шестнадцатеричному значению.

HEXTORAW(1234) = x'1234'

Каков алгоритм преобразования этого типа? Что происходит в коде за кулисами?

(Это мотивировано желанием создать эту функцию в СУБД, в которой нет функции HEXTORAW.)


person Josh Hull    schedule 28.08.2014    source источник


Ответы (2)


На этой странице: http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements001.htm#i46018

Когда Oracle автоматически преобразует данные RAW или LONG RAW в данные CHAR и обратно, двоичные данные представляются в шестнадцатеричной форме, где каждые четыре бита данных RAW представляют один шестнадцатеричный символ. Например, один байт данных RAW с битами 11001011 отображается и вводится как CB.

person Mark J. Bobak    schedule 28.08.2014
comment
Это полезное начало. Поэтому, как только механизм определяет правильное двоичное значение, он должен поместить эти биты непосредственно в ячейку памяти и адресовать их как необработанный тип данных. Это кажется точным? В отличие от кодирования этого значения в системном наборе символов и возврата его в виде значения varchar из единиц и нулей. Это то, что делает функция BINARY в DB2 на z/OS. - person Josh Hull; 29.08.2014
comment
Как я это интерпретирую, функция HEXTORAW() будет принимать любую произвольную строку шестнадцатеричных символов, преобразовывать ее в двоичную и сохранять как двоичную в типе данных RAW. - person Mark J. Bobak; 29.08.2014

Чтобы иметь полный алгоритм здесь:

Дана строка символов в качестве входного параметра

1. Убедитесь, что строка символов содержит только цифры 1–9 или буквы A–F.

2. Рассчитайте двоичное значение, перебирая каждый символ и объединяя соответствующее двоичное значение:

 binary    hexadecimal
 0000      0
 0001      1
 0010      2
 0011      3
 0100      4
 0101      5
 0110      6
 0111      7
 1000      8
 1001      9
 1010      a  
 1011      b
 1100      c  
 1101      d  
 1110      e  
 1111      f  

Например, 1234 будет:

0001 0010 0011 0100

3.Используя это значение, установите биты ячейки памяти.

4. Обратитесь к нему как к необработанному типу данных.

5.Верните его как возвращаемое значение функции

Результирующий необработанный тип данных будет иметь шестнадцатеричное представление, эквивалентное исходной строке.

При вводе «1234» функция вернет необработанный тип данных, который будет отображаться как шестнадцатеричное значение x «1234». Двоичные данные обычно представляются в шестнадцатеричном формате, чтобы их было легче читать и ссылаться на них.

(Это основано на ответе Марка Дж. Бобака, поэтому я хочу отдать ему должное, но я также хотел опубликовать полную процедуру.)

person Josh Hull    schedule 29.08.2014