我怎么能找到为什么我的腌制数据这么大?

2024-05-18 16:16:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python(如果重要的话,是3.1)应用程序,它将数据pickle为另一个进程使用,并通过网络连接交换它们。因为某些原因,一些交易所出人意料的大。。。我可以理解一些经过处理的数据并找出传输的内容,但仍然存在大量明显的二进制数据,我无法向自己解释,例如冗余字符串或大量二进制数据。在

你知道是否有一个wireshark插件可以帮助我完成这个任务,或者你会推荐给其他人的另一个过程,试图找出在这个对象通过连接传输之前应该做些什么?在

RouteDirect
q.).q.}q.(X...._RouteDirect__dst_nodeq.cnode
Node
q.).q.}q.(X...._Node__status_upq.NX...._Node__neighbourhoodq.NX...._Node__sendq.NX
..._Node__cpeq
cequation
CPE
q.).q.}q^M(X...._CPE__dim_countq.}q.X...._CPE__internal_nodesq.]q.ubX...._Node__major_stateq.NX...._Node__partition_idq.G?.$:..4.    X...._Node__name_idq.cnodeid
NameID
q.).q.}q.X^M..._NameID__nameq.X....checkq.sbX...._Node__dispatcherq.NX...._Node__pendingq.]q.cmessages

^我能理解:RouteDirect、CPE和NameID是我程序中的类。在

在TFIDSV中包含的数据不应该太多

^{pr2}$

这真是令人费解。在

qt).qu}qv(X...._LookupRequest__keyqwh!).qx}qyh$}qz(h&).q{}q|h)h*sbh+).q}}q~(h..h/h0).q.}q.
(h3h4h5.h6.h7h4ubh8h{ubh&).q.}q.h)h;sbh+).q.}q.(h..h/h0).q.}q.(h3h@h5.h6.h7h@ubh8h.ubh&).q.}q.h)hCsbh+).q.}q.(h..h/h0).q.}q.
(h3hHh5.h6.h7hHubh8h.ubh&).q.}q.h)hKsbh+).q.}q.(h..h/h0).q.}q.(h3hPh5.h6.h7hPubh8h.ubh&).q.}q.h)hSsbh+).q.}q.(h..h/h0).q.}q.
(h3hXh5.h6.h7hXubh8h.ubh&).q.}q.h)h[sbh+).q.}q.(h..h/h0).q.}q.
(h3h`h5.h6.h7h`ubh8h.ubusbX...._LookupRequest__nonceq.G?...u...X...._LookupRequest__fromq.h.).q.}q.(h.Nh.Nh.Nh
h.).q.}q.(h.}q.

最让我困惑的是,它似乎太规则了,不可能仅仅是二进制中的float/int。它对数字和[shub]和许多“孤立的”q有一些亲和力。。。这让我想起了更多的机器代码。还是只是我的眼睛?在

Node类中的pickle支持示例, # #定义特殊酸洗行为。在

def __getstate__(self):
    """Indicate witch fields should be pickled."""
    state = copy.copy(self.__dict__)

    # 'state' is a shallow copy: don't modify objects' content
    # Make transients fields point to nothing
    state['_Node__dispatcher'] = None
    state['_Node__send'] = None
    state['_Node__neighbourhood'] = None
    state['_Node__status_up'] = None
    state['_Node__data_store'] = None
    state['_Node__running_op'] = None
    state['_Node__major_state'] = None

    return state

许多其他对象(例如CPERouteDirect)没有__getstate__方法。当然,如果有一些技术不需要我遍历所有类的所有构造函数,我会很乐意的。在


Tags: 数据nonenode二进制statenxnhcpe
1条回答
网友
1楼 · 发布于 2024-05-18 16:16:45

啊,在读/usr/lib/python3.1/泡菜.py代码至少让一点变得不那么模糊:pickling的输出实际上是一些解释器的字节码,push/pop对解释了所看到的规则模式。在

BINPUT         = b'q'   # store stack top in memo; index is 1-byte arg
BINGET         = b'h'   # push item from memo on stack; index is 1-byte arg
EMPTY_TUPLE    = b')'   # push empty tuple
MARK           = b'('   # push special markobject on stack

等等

根据@Alfe的评论,我使用wireshark“follow TCP stream”和“另存为…”功能捕捉原始流量,然后使用

^{pr2}$

并使用Python求值器更好地了解其中的内容。尤其是使用

len(pickle.dump(x.my_field))

对于dir(x)报告的所有字段,允许我对过大的字段进行固定。不幸的是,我不能

^{4}$

正确工作(x[y]不是提取x.my_field的有效方法,而y=='my_field'>;<;)

相关问题 更多 >

    热门问题