python - 解析使用 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
任何指导或提示家伙将不胜感激!
解决方案
将 \023\304 视为高低部分。您需要对高位进行位移。
>>> high = '023'
>>> low = '304'
>>> high_dec = int(high, 8)
>>> low_dec = int(low, 8)
>>> (high_dec << 8) + low_dec
5060
推荐阅读
- sql - Postgres 通过前缀使用哪种类型的索引进行 varchar 搜索
- flutter - Android Studio 不再自动保存更改
- android - 如何在令牌验证器和注销用户中显示错误消息
- python - 在函数内部创建 Unittest 类不起作用
- typescript - 使用 TypeScript 在剧作家中实现 Mocha 和 Chai
- python-3.x - AppDynamics python 代理是否支持没有 wSGI 或 Gunicorn 的准系统 python 脚本?
- hadoop - 如何在 Windows 10 (Derby) 中初始化 Hive Metastore
- arrays - 基于数组元素 mongoDB 的组
- javascript - 如何在 Vue.Js 项目中使用交易视图图表小部件?
- reactjs - 如何在选择选项值时显示输入框?