使用python解析以djbdns格式创建的SRV DNS记录

时间:2019-05-10 17:17:44

标签: python bash parsing dns

我正在解析以TinyDNS格式(djbdns)编写的DNS区域文件,但在解码SRV记录时遇到问题。

到目前为止,我已经能够正确解析SRV记录中的所有内容,但下面的答案包含一组优先级,权重和端口的八进制数字(SRV DNS记录的正常值),可以作为一个示例。由here

生成
:_sip._tcp.example.com:33:\000\012\000\144\023\304\003pbx\007example\003com\000:86400

我遇到问题的部分是DNS答案:

\000\012\000\144\023\304\003pbx\007example\003com\000

前24个字符

\000\012\000\144\023\304

其他字符

\003pbx\007example\003com\000

前24个字符包含DNS将使用的服务的优先级,权重和端口,从第24个图表到字符串的末尾是提供服务的目标主机。因此,解析目标很容易,字符串之前的每个八进制集都是期望的字符数,并且正在删除句点。

Priority,Weight和Port接受0到65535之间的值,该值将这些值转换为2组255,即\ 000 \ 144 = 10个十进制,但如果数字大于256位,则使用第二组,即\ 023 \ 304 = 5060此时,我被阻止了,我不知道他们在做什么,单独转换或组合转换每个集合都没有给我正确的十进制数字。我知道我很近,但是被超级封锁了。我正在使用默认的int方法将八进制转换为dec,这很容易。

octal = '144'
dec   = int(octal, 8)

我解析完之后应该是这样的(显然空格是我在代码中为连接值所做的事情。

10 100 5060 pbx.example.com

任何指导或提示的人将不胜感激!

1 个答案:

答案 0 :(得分:1)

将\ 023 \ 304视为高低部分。 您需要将高位移位。

>>> high = '023'
>>> low = '304'
>>> high_dec = int(high, 8)
>>> low_dec = int(low, 8)
>>> (high_dec << 8) + low_dec
5060