将bytearray从varbinary(16)列转换为IP地址



我需要从HP Vertica数据库中提取大量数据并将其保存到文件中。我正在使用Vertica的官方ODBC驱动程序。

这是我到目前为止所做的:

cnxn = pyodbc.connect('DRIVER={Vertica};SERVER=localhost;DATABASE=db;UID=user;PWD=pw')
cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
cnxn.setencoding(str, encoding='utf-8')
cnxn.setencoding(unicode, encoding='utf-8')
cur = cnxn.cursor()
cur.execute("SELECT * FROM schema.table LIMIT 3")

然后我读取数据

for row in cur:
    print row

大多数字段都可以很好地返回 - Unicode文本,数字或数据记录。但是,对于存储IP地址的字段,我会得到以下内容:

bytearray(b'x00x00x00x00x00x00x00x00x00x00xffxffnox19\')

如何将其转换为文本?

对任何帮助,都非常感谢!

谢谢!

我看到有一个公认的答案,但是...对于所有其他答案:

如果您的数据在Vertica中,则非常首先要做的就是检查精细的SQL参考手册。在这种情况下,您会找到一个内置功能,可以将表示为Varbinary列的IPv6地址转换为字符串。

简单得多,要快得多:

SELECT V6_NTOA(your_column_here) ;

varbinary(16)是128位,这是IPv6地址的合适尺寸。样本数据解码为

0000:0000:0000:0000:0000:ffff:0a6f:195c

和ipv6上的Wikipedia文章的" IPv4映射IPv6地址"小节说,此类地址是映射到IPv6格式(128位)的IPv4地址(32位)。

::ffff:10.111.25.92

我们可以使用这样的函数从RAW bytearray数据中生成上面的这些字符串表示:

def bytes_to_ip_address(byte_array):
    if byte_array[0:12] == bytearray(b'x00x00x00x00x00x00x00x00x00x00xffxff'):
        return '{0}.{1}.{2}.{3}'.format(byte_array[12], byte_array[13], byte_array[14], byte_array[15])
    else:
        return ':'.join(['{0:02x}{1:02x}'.format(byte_array[i], byte_array[i + 1]) for i in range(0, len(byte_array), 2)])

if __name__ == '__main__':
    # examples
    fld = bytearray(b'x00x00x00x00x00x00x00x00x00x00xffxffnox19\')
    print(bytes_to_ip_address(fld))  # 10.111.25.92
    fld = bytearray(b'x01x00x00x00x00x00x00x00x00x00xffxffnox19\')
    print(bytes_to_ip_address(fld))  # 0100:0000:0000:0000:0000:ffff:0a6f:195c

或,使用Python3,我们可以使用iPaddress模块:

import ipaddress

def bytes_to_ip_address(byte_array):
    ip6 = ipaddress.IPv6Address(bytes(byte_array))
    ip4 = ip6.ipv4_mapped
    if ip4 == None:
        return str(ip6)
    else:
        return str(ip4)

if __name__ == '__main__':
    # examples
    fld = bytearray(b'x00x00x00x00x00x00x00x00x00x00xffxffnox19\')
    print(bytes_to_ip_address(fld))  # 10.111.25.92
    fld = bytearray(b'x01x00x00x00x00x00x00x00x00x00xffxffnox19\')
    print(bytes_to_ip_address(fld))  # 100::ffff:a6f:195c

相关内容

  • 没有找到相关文章

最新更新