C++ 到 Python 的行尾
Posted
技术标签:
【中文标题】C++ 到 Python 的行尾【英文标题】:End Of Line C++ to Python 【发布时间】:2014-03-31 20:34:41 【问题描述】:我正在做一个 python 程序,它读取套接字接收到的 C++ 数据包。 我打开它,它运行良好,直到它到达终点,我想 python 不理解 C++ EOL 字符,如果我没记错的话是“\0”。
所以我想我应该在字符串中搜索“\0”字符并用python EOL替换,但我不知道它是哪个字符!我搜索了但没有找到,以为是“\000”,但不起作用,这是我正在尝试的:
def decode(s):
return s\
.replace('\0','\000')\
data,adr = clientSkt.recvfrom(56)
r1,r2,r3 = unpack('B5s50s',data) #unsigned char, string[5], string[50]
r3 = decode(r3)
找到了: 我所做的是搜索 scape char \0,然后在 scape char 的索引之间剪切 50 个字符长的字符串,请参阅:
def decode(s):
i = 0
while (s[i] != "\0"):
i+=1
s = s[:-(50-i)]
print "Scape char is in " ,i
return s
data,adreca = skt1.recvfrom(56)
r1,r2,r3 = unpack('B5s50s',data)
print "r1=" ,r1
print "r2=" ,r2
print "r3=" ,r3
r3 = decode(r3)
print "r3=" ,r3
【问题讨论】:
\0
不是行尾,它的null
能把二进制数据的内容打印出来贴出来吗?将此添加到您的代码中...import binascii; print binascii.hexlify(data)
并发布结果。谢谢!
r1 = 2 r2 = 0000 r3 = usuari o extensio不正确�l]��&v��q]�binari数据
【参考方案1】:
您似乎正在从数据包中读取固定长度的字符串,如果它没有填满缓冲区,则字符串以空字符结尾,并且字符串后面可能有垃圾。您需要检测空字符并删除它以及它之后的所有字符。
def trim_zeros(s):
i = s.find('\x00')
if i < 0:
return s
return s[0:i]
【讨论】:
是的,伙计们!刚刚发现,现在它正在工作,但也谢谢! ;)【参考方案2】:在 Python 中,您没有 "\0"
字符来终止字符串。
试试:
def decode(s):
return s[:-1] if s[-1] == "\0" else s
【讨论】:
r1= 2 r2= 0000 r3= Usuari o extensio wronges.L]��&V��Q]. Decoded r3= Usuari o extensio wronges.L]��&V�� Q]� 仍然出现同样的错误! python 是如何知道它被终止的字符串?我知道它不是 \0 字符,但我必须有一个,不是吗? (基于 C 的)实现可能在内部使用以 null 结尾的字符串,但此细节不会暴露给 Python 接口。以上是关于C++ 到 Python 的行尾的主要内容,如果未能解决你的问题,请参考以下文章
强制打印功能中的行尾与python-shell Node.js中的原始字符串相同