【问题标题】:How can I convert a string that represent a HEX octet in postgresql to binary?如何将在 postgresql 中表示 HEX 八位字节的字符串转换为二进制?
【发布时间】:2019-03-15 09:46:32
【问题描述】:

我在 postgresql 中有一个以 mac 地址类型存储的 mac 地址。我需要转换有关 I/G 位和 U/L 位 (more infos) 的信息中的第一个八位字节。

示例: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

所以我已经隔离了第一位,但是,格式是“文本”,我无法将其转换为整数或二进制。

【问题讨论】:

  • 我在 pg 邮件列表中找到了这个:hex_to_int

标签: postgresql binary hex


【解决方案1】:

使用bit strings:

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。

【讨论】:

    猜你喜欢
    • 2012-03-04
    • 2015-06-27
    • 2013-09-07
    • 1970-01-01
    • 2019-03-14
    • 2021-12-20
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    相关资源
    最近更新 更多