如何将postgresql中表示十六进制八位组的字符串转换为二进制?

如何将postgresql中表示十六进制八位组的字符串转换为二进制?,postgresql,binary,hex,Postgresql,Binary,Hex,我在postgresql中存储了一个mac地址,类型为mac地址。我需要转换有关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 报税表为:

我在postgresql中存储了一个mac地址,类型为mac地址。我需要转换有关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作为integer
,但我收到了错误消息
[22P02]错误:integer的输入语法无效:“aa”

我想要的结果如下:

id, mac, octet, binary, ig_bit, ul_bit
13, aa:XX:XX:XX:XX:XX,aa, 1010 1010, 0, 1
所以我隔离了第一位,但是,格式是“text”,我不能将其转换为整数或二进制

使用

您也可以使用该功能,例如:


请注意,最左边一位的索引是0。

我在pg邮件列表中找到了:
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)
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