gpt4 book ai didi

python-2.7 - 如何在 Python 中解析具有八进制值的 char 数组?

转载 作者:行者123 更新时间:2023-12-02 21:44:01 25 4
gpt4 key购买 nike

编辑:我应该注意,我想要任何十六进制数组的一般情况,而不仅仅是我提供的谷歌数组。

编辑背景:背景是网络:我正在解析 DNS 数据包并尝试获取其 QNAME。我将整个数据包作为一个字符串,每个字符代表一个字节。显然这个问题看起来像一个 Pascal 字符串问题,并且使用 struct 模块似乎是正确的方法。

我在 Python 2.7 中有一个 char 数组,其中包含八进制值。例如,假设我有一个数组

DNS = "\03www\06google\03com\0"

我想要得到:

www.google.com

什么是有效的方法来做到这一点?我的第一个想法是迭代 DNS 字符数组并将字符添加到我的新数组答案中。每次我看到“\”字符时,我都会忽略“\”及其后面的两个字符。有没有办法在不使用新数组的情况下获取结果 www.google.com?

我恶心的实现(我的答案是一个字符数组,这不是我想要的,我只想要字符串 www.google.com:

DNS = "\\03www\\06google\\03com\\0"
answer = []
i = 0
while i < len(DNS):
if DNS[i] == '\\' and DNS[i+1] != 0:
i += 3
elif DNS[i] == '\\' and DNS[i+1] == 0:
break
else:
answer.append(DNS[i])
i += 1

最佳答案

既然您已经解释了真正的问题,那么到目前为止您得到的答案都不起作用。为什么?因为它们都是从字符串中删除像 \03 这样的序列的方法。但是您没有像 \03 这样的序列,您只有单个控制字符。

当然,您可以执行类似的操作,只需用点替换任何控制字符即可。

但是您真正想要做的并不是用点替换控制字符,而是解析 DNS 数据包。

DNS 由 RFC 1035 定义。 DNS 数据包中的 QNAME 为:

a domain name represented as a sequence of labels, where each label consists of a length octet followed by that number of octets. The domain name terminates with the zero length octet for the null label of the root. Note that this field may be an odd number of octets; no padding is used.

那么,让我们来解析一下。如果您了解“由“长度八位字节后跟该数量的八位字节”组成的标签与“Pascal 字符串”的关系,那么有一种更快的方法。此外,您可以将其编写为更干净、更简洁的生成器。但是让我们这样做最简单的方法:

def parse_qname(packet):
components = []
offset = 0
while True:
length, = struct.unpack_from('B', packet, offset)
offset += 1
if not length:
break
component = struct.unpack_from('{}s'.format(length), packet, offset)
offset += length
components.append(component)
return components, offset

关于python-2.7 - 如何在 Python 中解析具有八进制值的 char 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19871194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com