Строка из списка байтов? - PullRequest
       19

Строка из списка байтов?

1 голос
/ 09 января 2020

Очень разочарован, пытаясь преобразовать список python в строку, но он продолжает превращать отдельные байты в 3-байтовые объекты.

Мой код получает байты из соединения i2 c и сохраняет их в списке , Он должен посылать их по сети как строковый объект, и он это делает. Однако на стороне java на моем компьютере один байт, такой как 254, буквально

00110010 
00110101
00110100 

вместо 11111110.

Пожалуйста, сообщите?

Прямо перед преобразование, я печатаю массив на мой экран:

print("outgoing")
print(outgoing)

Это результат печати экрана:

outgoing
[254, 5, 0, 255, 255, 255, 255, 255, 255, 255, 254, 0, 202]

Я попытался преобразовать список в одну строку следующим образом:

st = ''
try:
    for e in outgoing:
        st += str(e)
except:
    e = sys.exc_info()[0]
    print(e)
print(st)

Я пробовал несколько других способов конвертировать его. Мой метод записи в сеть принимает строковый объект, и в остальном все работает нормально.

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Быть ужасным в python и чувствовать себя малышом без повара ie У меня было два варианта.

Один из них заключался в добавлении строки с нулями в префиксе в python, чтобы создать строку представление о том, что python дал мне работу в моем коде в другом месте.

Вторым было создание этой пародии в коде python следующим образом. Спасибо за совет, так как я обновил свой pi до py3, и это привело меня в правильном направлении.

Как вы можете видеть, я использую pybluez и smbus2 для облегчения передачи данных. Если есть лучший пример, я уверен, что не прочь его увидеть.

def move_data(bus, incoming):
if not incoming:
    return ""
#print('incoming')
#print(incoming)
readfail = 1
add = b'\x00'
adloc = 0
data = []
outgoing = []
outgoing.append(b'\xfe')
info = [incoming[i:i+1] for i in range(0, len(incoming), 1)]
#print(info)
for s in info:
    #print(s)
    i = struct.unpack('<c', s)
    #print(i[0])
    if i[0] == b'\xfe':
        #print("254")
        if add != b'\x00':
            #print("add")
            if len(data) > 0:
                #print("send data")
                #print(add)
                #print(data)
                write_slave(bus, add, data)
                print("sent")
                outgoing.append(add)
                while readfail == 1:
                    try:
                        print("stuck")
                        time.sleep(.005)
                        addlist = list(add)
                        var = read_slave(bus, addlist[0], 8)
                        print("stuck---")
                        readfail = 0

                    except:
                        pass

                print("return data")
                print(var)
                now = bytes(var)
                print(now)
                rtn = [now[i:i + 1] for i in range(0, len(now), 1)]
                for e in rtn:
                    q = struct.unpack('<c', e)
                    outgoing.append(q[0])
                outgoing.append(b'\xfe')
            readfail = 1
            add = b'\x00'
            del data[:]
        else:
            adloc = 1
    elif adloc == 1:
        add = i[0]
        adloc = 0
        #print("added add")
    else:
        data.append(i[0])
        #print("added data")
outgoing.append(add)
outgoing.append(data[0])

    #ad = mlist
    #if ad != 0:
        #if s != '':
            #write_slave(bus, ad, s[2:])update to python 3
        #fromParts += ad
        #fromParts += read_slave(bus, ad, s[2:].len())
        #fromParts += b'fe'
#print_string(out)
print("outgoing")
print(outgoing)

#st = ''.join([chr(b) for b in outgoing])

#st = bytearray(outgoing)

#st = b''
#try:
    #for e in outgoing:
        #if e < 100:
            #st += '0'
            #if e < 10:
                #st += '0'
        #st += str(e)
#except:
    #e = sys.exc_info()[0]
   # print(e)
st = b''.join(outgoing)
#print(st)
return st

Вот куда я отправляю его для написания ... не смейтесь

def write_slave(bus, add, data):
st = b''.join(data)
datlist = list(st)
addlist = list(add)

bus.write_i2c_block_data(addlist[0], cmdReq, datlist)
0 голосов
/ 09 января 2020

Вот ваша проблема: вы объединяете строковые представления этих чисел вместе , а не сами байты. В Python 2 может быть лучший способ, но: st = str(bytearray(outgoing)) должно работать ... Черт, bytearray(outgoing) может работать само по себе.

Итак, чтобы было ясно, чем вы были делать по сути:

>>> outgoing = [254, 5, 0, 255, 255, 255, 255, 255, 255, 255, 254, 0, 202]
>>> st = ''.join(map(str, outgoing))
>>> st
'254502552552552552552552552540202'

Но это не то, что вы хотите, вы хотите:

>>> str(bytearray(outgoing))
'\xfe\x05\x00\xff\xff\xff\xff\xff\xff\xff\xfe\x00\xca'

Хотя, как я уже говорил, в зависимости от того, какого клиента вы используете ,

>>> bytearray(outgoing)
bytearray(b'\xfe\x05\x00\xff\xff\xff\xff\xff\xff\xff\xfe\x00\xca')

вполне может быть достаточно.

Обратите внимание: если кто-то находится в подобной ситуации на Python 3, тогда вам просто нужно:

>>> outgoing = [254, 5, 0, 255, 255, 255, 255, 255, 255, 255, 254, 0, 202]
>>> bytes(outgoing)
b'\xfe\x05\x00\xff\xff\xff\xff\xff\xff\xff\xfe\x00\xca'
...