如何在Python 3上转换包含binary / ascii mix的字符串

时间:2017-04-04 00:32:06

标签: python string byte utf

我有一个在Windows上使用Python 2.7的系统。我正在尝试转换到Linux和Python 3以用于特定应用程序(现有的Windows系统将继续使用 - 其中有许多)。该系统包括一个USB连接板,其接口可以像串行端口一样工作,但不是串行端口。在初始化和配置之后,我可以发送包含命令/数据对的字符串并获得响应。在某些情况下,数据和命令可以是非ASCII值(> 0x7F)或可以是ASCII字符串。在Python 2.7中,我可以构造一个字符串,如chr(command)+ ASCIIstring,发送它,它的工作原理。当我收到一个字符串后,我可以搜索它的键值,验证结果是否在范围内等。如果我得到一个字节值,例如某些开关或传感器的值,我可以做ord(值)得到一个整数,然后我可以检查各个位。

由于Python 2没有字节值,因此字符串和字节可以混合使用。但是在Python 3中,如果我使用编码和解码或字节(十六进制数组)转换,我要么发送或接收问题。如果我尝试转换为UTF,编解码器会出现问题,如交换机的0xFF。我需要的是一种方法,可以轻松地从可能具有任何值来回的Python 3字节数组转换为python 2类型字符串。经过很多挫折之后,我想出了以下内容(Windows功能仍然存在,因为我希望这个特定模块与操作系统无关):

这是读取USB设备的功能的一部分,FD是打开设备的文件描述符。 它返回一个python 2样式的字符串

if LinuxFlag:
    if InWaiting(FD):
        z = os.read(FD, size)
        if Python3:
            w = ""
            for char in z: w += chr(char)
            return w
        else: return z
    else: return ""

if WinFlag:
    x, indata = win32file.ReadFile(FD, size)
    return indata

这是写入USB设备的功能的一部分。它接受python 2样式的字符串

if LinuxFlag:
    if Python3:
        BAlist = []
        for char in StringOfBytes: BAlist.append(ord(char))
        os.write(FD, bytes(BAlist))
    else: os.write(FD, StringOfBytes)
if WinFlag: result = win32file.WriteFile(FD, StringOfBytes)

这是一个冗长的解释,但这是我的问题:正如你所看到的,我找到了一种方法来循环传入数据的每个字节并将其放入我可以搜索的字符串中,使用ord(),对于发送,我将传入的字符串转换为一个字节数组,一次一个字节,然后使用bytes()函数使其成为Python 3写入函数将接受的东西。有没有办法自动执行这些转换而不会出现编解码器错误或其他错误?似乎Python 3失去了将ASCII(不是UTF-8)与二进制数据混合的能力,就像不考虑用例一样。我找不到能够一步完成这些转换的功能。我的工作,但在两个方向迭代整个阵列似乎非常笨拙。我在这里看到过类似的问题,但除非我误解了某些内容,否则它们与此有点不同。

0 个答案:

没有答案