我正在使用xmlrpc将一串字符(任意8位字符)从服务器发送到客户端。事实证明,回车符\r
(dec 13
十六进制0xd)被抑制。也就是说,当原始字符串由以下三个字符组成时(由它们的十六进制代码表示):
0x3a 0xd 0xa
然后我在客户端收到的只有'两个'字符:
0x3a 0xa
如何配置xmlrpc(在python中),以便能够使用0xd
接收完整的原始3个字符的字符串?有没有办法可以在不使用二进制包装器或其他东西的情况下完成?
答案 0 :(得分:1)
当您将str对象作为XML-RPC中的字符串值传递时,它将被编码并解码为字符串。 (顺便说一下,该字符串应该包含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')
),什么都没有帮助。
答案 1 :(得分:0)
作为python3的更新,请使用xmlrpc.client代替xmlrpclib:
>>> from xmlrpc.client import dumps, loads