字符串到python中的wstring

时间:2016-08-16 20:09:38

标签: python string sockets wstring

我有一个接收不同长度数据报的udp套接字。 第一个数据报指定它将接收哪种类型的数据,例如64-means bool false,65-means bool true,66-means sint,67-means int等等。由于大多数数据类型都具有已知长度,但是当涉及到字符串和wstring时,第一个字节表示85-表示字符串,接下来的2个字节表示字符串长度后跟实际字符串。对于wstring 85,接下来的2个字节表示wstring长度,后跟实际的wstring。

要解析上述类型的wstring格式b'U\x00\x07\x00C\x00o\x00u\x00p\x00o\x00n\x001'我使用了以下代码

data = str(rawdata[3:]).split("\\x00")
data = "".join(data[1:])
data = "".join(data[:-1])

这是正确的还是其他简单方法?

当我收到数据报时,我也需要发送数据报。但我不知道如何创建数据报,因为socket.sendto需要bytes。如果我尝试将字符串转换为utf-16格式,它将转换为wstring。如果是这样,我如何将其余信息添加到bytes

根据以上数据报信息U - 85,即wstring,\x00\x07 - wstring数据的长度为\x00C\x00o\x00u\x00p\x00o\x00n\x001 - 是实际字符串Coupon1

1 个答案:

答案 0 :(得分:1)

完整的答案取决于您打算如何处理结果数据。用'\x00'分割字符串(假设你的意思是什么?不确定我理解为什么那里有两个反斜杠)并没有多大意义。首先使用wstring类型的原因是能够表示不是普通的8位(真正的7位)ascii的字符。如果你有任何不是标准罗马字符的字符,那么它们可能会有一个除了零字符之外的其他字符,在这种情况下你的split结果是没有意义的。

警告:既然你提到需要字节的sendto,我假设你正在使用python3。 python2下的细节会略有不同。

无论如何,如果我明白你的意思是什么,那么“utf-16-be”编解码器可能正是你所寻找的。 (“utf-16”编解码器在您可能不需要的编码字符串的开头放置“字节顺序标记”;“utf-16-be”只是将大端16位字符放入字节字符串。)解码可以这样执行:

rawdata = b'U\x00\x07\x00C\x00o\x00u\x00p\x00o\x00n\x001'

dtype = rawdata[0]
if dtype == 85:        # wstring
    dlen = ord(rawdata[1:3].decode('utf-16-be'))
    data = rawdata[3: (dlen * 2) + 3]
    dstring = data.decode('utf-16-be')

这会将dstring保留为python unicode字符串。在python3中,所有字符串都是unicode。所以你已经完成了。

编码可以这样做:

tosend = 'Coupon1'
snd_data = bytearray([85])  # wstring indicator
snd_data += bytearray([(len(tosend) >> 8), (len(tosend) & 0xff)])
snd_data += tosend.encode('utf-16-be')