Python байтовый массив print () дает неправильные значения - PullRequest
0 голосов
/ 19 декабря 2018

Используя python 3, я создал следующий сценарий, состоящий из класса модели, содержащего сотни байтовых массивов, и в том же сценарии вне класса модели. Я печатаю некоторые из них, чтобы убедиться, что они верны.Когда я печатаю значения, некоторые значения не соответствуют ожиданиям. (Я помещаю закодированные комментарии, чтобы определить их в приведенном ниже коде)

Вот краткая версия моего скрипта с некоторыми байтами

`
class Model:
    def __init__(self):

        # weird values:
        self.bp_diastole_118 = bytearray(b'\xff\x01\x02\x01\x01\x00\x02\x3b')
        self.bp_diastole_120 = bytearray(b'\xff\x01\x02\x01\x01\x00\x02\x3c')
        self.bp_diastole_122 = bytearray(b'\xff\x01\x02\x01\x01\x00\x02\x3d')
        self.bp_diastole_124 = bytearray(b'\xff\x01\x02\x01\x01\x00\x02\x3e')
        self.bp_diastole_126 = bytearray(b'\xff\x01\x02\x01\x01\x00\x02\x3f')
        self.bp_diastole_128 = bytearray(b'\xff\x01\x02\x01\x01\x00\x02\x40')
        self.bp_diastole_160 = bytearray(b'\xff\x01\x02\x01\x01\x00\x02\x50')

        # correct values:
        self.pupil_r_normal = bytearray(b'\xff\x01\x02\x01\x01\x00\x03\xc3')
        self.pupil_r_dilated = bytearray(b'\xff\x01\x02\x01\x01\x00\x03\xc4')
        self.pupil_r_constriced = bytearray(b'\xff\x01\x02\x01\x01\x00\x03\xc5')
        self.pupil_r_reaction_on = bytearray(b'\xff\x01\x02\x01\x01\x00\x03\xc6')
        self.pupil_r_reaction_off = bytearray(b'\xff\x01\x02\x01\x01\x00\x03\xc7')




m = Model()  

print('--------------weird value------------------')
print('bp_diastole_118 = {}'.format(m.bp_diastole_118))
print('bp_diastole_120 = {}'.format(m.bp_diastole_120))
print('bp_diastole_122 = {}'.format(m.bp_diastole_122))
print('bp_diastole_124 = {}'.format(m.bp_diastole_124))
print('bp_diastole_126 = {}'.format(m.bp_diastole_126))
print('bp_diastole_128 = {}'.format(m.bp_diastole_128))
print('bp_diastole_160 = {}'.format(m.bp_diastole_160))

print('-------------correct value--------------------')
print('pupil_r_normal = {}'.format(m.pupil_r_normal))
print('pupil_r_dilated = {}'.format(m.pupil_r_dilated))
print('pupil_r_constriced = {}'.format(m.pupil_r_constriced))
print('pupil_r_reaction_on = {}'.format(m.pupil_r_reaction_on))
print('pupil_r_reaction_off = {}'.format(m.pupil_r_reaction_off))

вот что выводится на консоль:

`
--------------weird value------------------
bp_diastole_118 = bytearray(b'\xff\x01\x02\x01\x01\x00\x02;')
bp_diastole_120 = bytearray(b'\xff\x01\x02\x01\x01\x00\x02<')
bp_diastole_122 = bytearray(b'\xff\x01\x02\x01\x01\x00\x02=')
bp_diastole_124 = bytearray(b'\xff\x01\x02\x01\x01\x00\x02>')
bp_diastole_126 = bytearray(b'\xff\x01\x02\x01\x01\x00\x02?')
bp_diastole_128 = bytearray(b'\xff\x01\x02\x01\x01\x00\x02@')
bp_diastole_160 = bytearray(b'\xff\x01\x02\x01\x01\x00\x02P')
-------------correct value--------------------
pupil_r_normal = bytearray(b'\xff\x01\x02\x01\x01\x00\x03\xc3')
pupil_r_dilated = bytearray(b'\xff\x01\x02\x01\x01\x00\x03\xc4')
pupil_r_constriced = bytearray(b'\xff\x01\x02\x01\x01\x00\x03\xc5')
pupil_r_reaction_on = bytearray(b'\xff\x01\x02\x01\x01\x00\x03\xc6')
pupil_r_reaction_off = bytearray(b'\xff\x01\x02\x01\x01\x00\x03\xc7')

Как видите, хорошие значения выводят именно то, что я ожидал, и они идентичны значениям, которые я инициализировал.Однако, если вы посмотрите на то, что было напечатано из странных значений, вы увидите, что последние 3 символа не соответствуют значениям, которые я инициализировал.

т.е.
initialized:
self.bp_diastole_118 = bytearray (b '\ xff \ x01 \ x02 \ x01 \ x01 \ x00 \ x02 \ x3b ')
отличается от напечатанного:
bp_diastole_118 = bytearray (b' \ xff \ x01 \ x02 \ x01 \ x01 \ x00 \x02; ')

Кто-нибудь знает, почему это происходит и как я могу решить проблему?

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

вы видите utf представление шестнадцатеричного значения, которое вы установили, например, utf ('0x3b') == ';'

0 голосов
/ 19 декабря 2018

Проблема, которую я обнаружил, заключается в том, что с x3b по x50 они выводят последнюю часть в виде специального символа с x50, равным P. Если вы тестируете, используя bytearray(b'\x3b'), для вас будет отображаться окончание

...