bLAZ
bLAZ

Reputation: 1751

Convert 'bytes' object to string

I tried to find solution, but still stuck with it. I want to use PyVisa to control function generator. I have a waveform which is a list of values between 0 and 16382 Then I have to prepare it in a way that each waveform point occupies 2 bytes. A value is represented in big-endian, MSB-first format, and is a straight binary. So I do binwaveform = pack('>'+'h'*len(waveform), *waveform) And then when I try to write it to the instrument with AFG.write('trace ememory, '+ header + binwaveform) I get an error:

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

I tried to solve it with AFG.write('trace ememory, '+ header + binwaveform.decode()) but it looks that by default it tries to use ASCII characters what is not correct for some values: UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 52787: invalid start byte

Could you please help with it?

Upvotes: 3

Views: 1201

Answers (1)

Alastair McCormack
Alastair McCormack

Reputation: 27744

binwaveform is a packed byte array of an integer. E.g:

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

You can't print it as it makes no sense to your terminal. In the above example, 0xC1 is invalid ASCII and UTF-8.

When you append a byte string to a regular str (trace ememory, '+ header + binwaveform), Python wants to convert it to readable text but doesn't know how.

Decoding it implies that it's text - it's not.

The best thing to do is print the hex representation of it:

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

Upvotes: 2

Related Questions