字符串到蟒蛇wstring

问题描述:

我有一个udp套接字接收不同长度的数据报。 第一个数据报指定了要接收的数据类型,例如64-表示bool false,65-表示bool真,66-表示sint,67-表示int等等。由于大多数数据类型都有已知的长度,但是当涉及到字符串和wstring时,第一个字节表示85-means字符串,接下来的2个字节表示字符串长度后跟实际字符串。对于wstring 85,接下来的2个字节表示wstring的长度,后面跟着实际的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 - 7长度wstring的数据,\x00C\x00o\x00u\x00p\x00o\x00n\x001 - 是实际的字符串Coupon1

一完整的答案取决于你打算如何处理结果数据。将字符串拆分为'\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')