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中的原始字符串相同

在Python中的文本文件中逐个查找行尾

追加到文件中的行尾

匹配后删除到行尾,保留不匹配的行

Python的130行代码等于1580的行C++的代码 ?Python 的10大谬论

如何在不使用 getline 的情况下在 C++ 中将输入字符串直到行尾