Andrew Lalis Andrew Lalis - 1 month ago 16
Python Question

Python Convert String to Byte

I am trying to do some serial input and output operations, and one of those is to send an 8x8 array to an external device (Arduino). The pySerial library requires that the information that I send be a byte. However, in my python code, the 8x8 matrix is made up of types

<class 'str'>
. Here's my sending function:

import serial
import Matrix

width = 8
height = 8
portName = 'COM3'

def sendMatrix(matrix):
try:
port = serial.Serial(portName, 9600, timeout = 1000000)
port.setDTR(0)
print("Opened port: \"%s\"." % (portName))
receivedByte = port.read()
print(int(receivedByte))
if (receivedByte == '1'):
port.write('1')
bytesWritten = 0
for row in range(8):
for col in range(8):
value = matrix.getPoint(col, row)
bytesWritten += port.write(value)//ERROR HERE!
print(int(port.read()));
port.close()
print("Data (%d) sent to port: \"%s\"." % (bytesWritten, portName))
except:
print("Unable to open the port \"%s\"." % (portName))


def main():
matrix = Matrix.Matrix.readFromFile('framefile', 8, 8)
matrix.print()
print(type(matrix.getPoint(0, 0)))
print(matrix.getPoint(1, 1))
sendMatrix(matrix)

main()


Now, I have a class
Matrix
, which contains a field
map
, which is the array in question, and I will include that code here too, but the problem I'm having is that each element in the array is of type
str
, but I need to convert it to a byte. I can disregard possible loss of data, since in practice, I only use 0's and 1's.

My Matrix Class:

class Matrix(object):

def __init__(self, width, height):
self.width = width
self.height = height
self.map = [[0 for x in range(width)] for y in range(height)]

def setPoint(self, x, y, value):
if ((x >= 0) and (x < self.width) and (y >= 0) and (y < self.height)):
self.map[y][x] = value

def getPoint(self, x, y):
if ((x >= 0) and (x < self.width) and (y >= 0) and (y < self.height)):
return self.map[y][x]

def print(self):
for row in range(self.height):
for col in range(self.width):
print(str(self.map[row][col])+" ", end="")
print()

def save(self, filename):
f = open(filename, 'w')
for row in range(self.height):
for col in range(self.width):
f.write(str(self.map[row][col]))
f.write('\n')
f.close()

def toByteArray(self):
matrixBytes = bytearray(self.width * self.height)
for row in range(self.height):
for col in range(self.width):
matrixBytes.append(int(self.map[row][col]))
return matrixBytes

def getMap(self):
return self.map

def readFromFile(filename, width, height):
f = open(filename, 'r')
lines = list(f)
matrix = Matrix(width, height)
f.close()
for row in range(len(lines)):
matrix.map[row] = lines[row].strip('\n')
return matrix

Answer

To transform a unicode string to a byte string in Python do this:

>>> 'foo'.encode('utf-8')
b'foo'

To transform a byte string to a unicode string:

>>> b'foo'.decode('utf-8')
'foo'