Как я могу преобразовать строку, представляющую октет HEX в postgresql, в двоичный файл? - PullRequest
1 голос
/ 15 марта 2019

У меня есть mac адрес, сохраненный с типом mac address в postgresql. Мне нужно преобразовать первый октет в информацию о бите I / G и бите U / L ( больше информации ).

Пример: MAC-адрес AA-BB-CC-DD-EE-FF. Первый октет - это AA. Преобразовано в двоичный код: 0101 01010. Последний бит представляет I / G: 0. Второй справа налево бит U / L: 1.

Как я могу сделать это в запросе postgresql?

Это то, что я имею до сих пор:

select id, mac, left(mac::text,2) as octet 
from mytable

Возврат:

id,mac,octet
13,aa:XX:XX:XX:XX:XX,aa

Я также пытался left(mac::text,2)::integer as integer, но я получаю сообщение об ошибке [22P02] ERROR: invalid input syntax for integer: "aa"

Я хочу получить следующий результат:

id, mac, octet, binary, ig_bit, ul_bit
13, aa:XX:XX:XX:XX:XX,aa, 1010 1010, 0, 1

Итак, я выделил первый бит, однако формат «текст», и я не могу преобразовать его в целое или двоичное.

1 Ответ

1 голос
/ 15 марта 2019

Использовать битовые строки:

with my_data(mac) as (
    values ('AA-BB-CC-DD-EE-FF'::macaddr)
)

select 
    mac,
    ('x' || left(mac::text, 2))::bit(8) as octet,
    substr(('x' || left(mac::text, 2))::bit(8)::text, 8, 1) as ig_bit,
    substr(('x' || left(mac::text, 2))::bit(8)::text, 7, 1) as ul_bit
from my_data

        mac        |  octet   | ig_bit | ul_bit 
-------------------+----------+--------+--------
 aa:bb:cc:dd:ee:ff | 10101010 | 0      | 1
(1 row)

Вы также можете использовать функцию get_bit(), например ::

with my_data(mac) as (
    values ('AA-BB-CC-DD-EE-FF'::macaddr)
),
octet as (
    select mac, ('x' || left(mac::text, 2))::bit(8) as binary_octet
    from my_data
)

select 
    mac,
    binary_octet,
    get_bit(binary_octet, 7) as ig_bit,
    get_bit(binary_octet, 6) as ul_bit
from octet

Обратите внимание, что индекс самого левого бита равен 0.

...