将'bytes'对象转换为字符串

时间:2017-07-25 08:45:10

标签: python string encoding

我试图找到解决方案,但仍坚持使用它。 我想用PyVisa来控制函数发生器。 我有一个waveform,它是016382之间的值列表 然后我必须以每个waveform点占用2个字节的方式准备它。 值以big-endian,MSB-first格式表示,并且是直接二进制。我做binwaveform = pack('>'+'h'*len(waveform), *waveform) 然后当我尝试用AFG.write('trace ememory, '+ header + binwaveform)将其写入乐器时,我收到错误:

  File ".\afg3000.py", line 97, in <module>
    AFG.write('trace ememory, '+ header + binwaveform)
TypeError: Can't convert 'bytes' object to str implicitly

我试图用AFG.write('trace ememory, '+ header + binwaveform.decode())来解决它,但它看起来默认情况下会尝试使用ASCII字符,这些字符对于某些值不正确:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 52787: invalid start byte

你能帮忙吗?

1 个答案:

答案 0 :(得分:2)

binwaveform是整数的压缩字节数组。 E.g:

struct.pack('<h', 4545)
b'\xc1\x11'

您无法打印它,因为它对您的终端没有意义。在上面的例子中, 0xC1是无效的ASCII和UTF-8。

当你将一个字节字符串附加到常规str(trace ememory, '+ header + binwaveform)时,Python希望将它转换为可读文本,但不知道如何。

解码它意味着它是文本 - 它不是。

最好的办法是打印它的十六进制表示:

import codecs
binwaveform_hex = codecs.encode(binwaveform, 'hex')
binwaveform_hex_str = str(binwaveform_hex)
AFG.write('trace ememory, '+ header + binwaveform_hex_str)