首页 > 解决方案 > 解析使用 python 以 djbdns 格式创建的 SRV DNS 记录

问题描述

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

到目前为止,我能够正确解析 SRV 记录中的所有内容,但下面的答案包含一组用于优先级、权重和端口的八进制数字(SRV DNS 记录的正常值)是可以从此处生成的示例

:_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 个图表到字符串末尾是提供服务的目标主机。因此解析目标很容易,字符串之前的每个八进制集都是预期之间的字符数,并且正在删除句点。

优先级、权重和端口接受 0 - 65535 之间的值,将这些值转换为 255 的 2 组,即 \000\144 = 十进制的 10,但如果数字超过 256 位,则它使用第二组,即 \023\304 = 5060 在这一点上我被阻止了我不知道他们在做什么,单独或一起转换每个集合并没有给我正确的十进制数。我知道我很近,但被超级封锁了。我正在使用默认的 int 方法从八进制转换为十进制,这相当容易。

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

在我解析它之后,它应该是这样的(显然空格是我在我的代码中用来连接值的东西。

10 100 5060 pbx.example.com

任何指导或提示家伙将不胜感激!

标签: pythonbashparsingdns

解决方案


将 \02​​3\304 视为高低部分。您需要对高位进行位移。

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

推荐阅读