我正在使用 xmlrpc 将字符串(任意 8 位字符)从服务器发送到客户端。事实证明,回车符\r
(dec 13
hex 0xd)被抑制了。也就是说,当原始字符串由以下三个字符组成时(由它们的十六进制代码表示):
0x3a 0xd 0xa
然后我在客户端只收到“两个”字符:
0x3a 0xa
如何配置 xmlrpc(在 python 中),以便能够接收完整的原始 3 字符字符串0xd
?有没有一种方法可以在不使用二进制包装器或其他东西的情况下完成?
当您在 XML-RPC 中将 str 对象作为字符串值传递时,它会被编码和解码为字符串。(顺便说一句,该字符串应该由 XML 中允许的字符组成,尽管这在您的情况下并不重要。)它不是二进制块,并且在解析 XML 时\r\n
被转换为。\n
恕我直言,无能为力,也没有任何选项可以挽救局面。
只需查看对您的字符串执行的操作和dumps()
操作:loads()
xmlrpclib
>>> from xmlrpclib import dumps, loads
>>> s = '\x3a\x0d\x0a'
>>> e = dumps((s,)) # Just a tuple
>>> e
'<params>\n<param>\n<value><string>:\r\n</string></value>\n</param>\n</params>\n'
>>> loads(e)
((':\n',), None)
因此,当loads()
被执行时,\r\n
序列被转换为\n
,并且\r
丢失了。当然,您可以使用转换后的字符串(例如s.encode('hex')
,看起来很不错),但是,据我所知,如果您不能更改服务器行为(s.decode('hex')
在参数上执行),则无济于事。
作为 python3 的更新,使用 xmlrpc.client 代替 xmlrpclib:
>>> from xmlrpc.client import dumps, loads