LINUX.ORG.RU

Как собрать байты в строчку через \x?

 , ,


0

1

Всё просто, как пареная репа, но я что-то слегка запутался в питоньих функциях.

>>> devId = 0x5a
>>> devInit = 0xa0
>>> hex(devId + devInit)
'0xfa'

Значит, для отправки в последовательный порт мне нужна строчка b'\x5a\xa0\xfa'. Как её сформировать, не разводя индусского кода?

Ответ на: комментарий от Crocodoom

Да, верно. Спасибо большое.

vvn_black, вот это уже второй вопрос, который я хотел задать, чтобы два раза не ходить, так сказать. Я пытаюсь переписать в виде простого скрипта более объёмную, с GUI, программу на Паскале (Delphi, если быть точным). И из того, что в проге жёстко задан массив txbuf: array [0..2] of byte;, я могу сделать 2 вывода: а) Паскалю чихать на переполнения — контроль значений остаётся за человеком; б) железке, с которой работает эта программа, тоже, видимо, всё равно — она всегда принимает по три байта.

Я не знаток Паскаля, но проверил в онлайновом редакторе вот такой код:

//fpc 3.0.0

program HelloWorld;

Uses sysutils;

const
    devId = $5a;
    chOk = $a8;

var
    txbuf: array [0..2] of byte;
    I: longint;

begin
    txbuf[0] := devId;
    txbuf[1] := chOk;
    //txbuf[2] := txbuf[0] + txbuf[1];
    for I:=0 to high(txbuf)-1 do inc(txbuf[high(txbuf)], txbuf[i]);
    for I:=0 to 2 do writeln(IntToHex(txbuf[I], 8));
end.

На выходе получаем:

0000005A
000000A8
00000002

Хотя конечно, в сумме (без ограничения размера) получается 0x102. А вот почему сумму автор той, старой программы, получает циклом с inc() (аналог сишного +=), я так и не понял. Подозревал какой-нибудь подвох, но вроде, результат всегда одинаковый с простым сложением.

al_exquemelin ★★★
() автор топика
Ответ на: комментарий от al_exquemelin

В питоне сложения с переносом по умолчанию не будет, и при использовании bytes получится эксепшен, если devId + devInit > 255.

И тут всё зависит от железки, если строго 3 байта в посылке (третий - это типа контрольной суммы?), то надо озаботиться обработкой этой ситуации.

vvn_black ★★★★★
()

как вариант:

>>> b'%c%c' % (0x5a, 0xa0)
b'\x5a\xa0'

MyTrooName ★★★★★
()
Ответ на: комментарий от vvn_black

Да, я вижу, при переполнении получается ValueError. Ну, или OverflowError в варианте, который предложил ниже MyTrooName (за что ему спасибо). Буду вычитать при необходимости 255, или сколько там надо :)

если строго 3 байта в посылке (третий - это типа контрольной суммы?)

Похоже на то. Во всяком случае, в той проге массивы под буфера объявлены глобально один раз и используются повсюду, а Паскаль не должен бы неожиданно менять их размер. Да, и в конце считанных данных последним байтом тоже приходит контрольная сумма.

al_exquemelin ★★★
() автор топика
Ответ на: комментарий от MyTrooName

Угу, я уже понял, что наврал. Действительно, там контрольная сумма может получиться в духе 0x625, и нужен остаток от деления на 256.

al_exquemelin ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.