Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 11, 2009 18:15:37

mks
От:
Зарегистрирован: 2009-08-07
Сообщения: 80
Репутация: +  5  -
Профиль   Отправить e-mail  

Вывод знаковых чисел. проблема.

Здравствуйте увожаемые.
Проблема вот в чем: в скрипте читаю данные из COM порта по 4 байта и формирую из них 32-х битные слова. Далее эти слова нужно сохранить в файл (или вывести на экран) как целые со знаком. Делаю примерно следующее:

byte1=0xFF
byte2=0xFF
byte3=0xFF
byte4=0xFF

k=(byte4<<24)|(byte3<<16)|(byte2<<8)|(byte1)

print('%d\n' % k)
Но вместо -1 получаю 4294967295. Как объяснить питону что k это знаковое число ? Возможно нужно действовать как то подругому ?



Офлайн

#2 Авг. 11, 2009 19:25:49

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Вывод знаковых чисел. проблема.

Через struct преобразовывай



Офлайн

#3 Авг. 12, 2009 12:40:00

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Вывод знаковых чисел. проблема.

можно так попробовать:

byte1=0xFF
byte2=0xFF
byte3=0xFF
byte4=0x7F
k=(byte4<<24)|(byte3<<16)|(byte2<<8)|(byte1)

if k>2147483647: k-=4294967296

print k

Отредактировано (Авг. 12, 2009 12:43:36)

Офлайн

#4 Авг. 12, 2009 13:32:03

mks
От:
Зарегистрирован: 2009-08-07
Сообщения: 80
Репутация: +  5  -
Профиль   Отправить e-mail  

Вывод знаковых чисел. проблема.

o7412369815963 спасибо, пожалуй это лучшее решение. Эх я когдато так и делал а щас как память отшибло :)



Офлайн

#5 Авг. 12, 2009 16:28:36

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Вывод знаковых чисел. проблема.

Ну-ну…

>>> f(0x01, 0xff, 0xff, 0xff)
33554431
>>> f(0xff, 0xff, 0xff, 0xff)
-1L
>>>
Оно вам такое надо: то возвращается int, а то - long. Который к тому же изрядно тормозит. И автоматом в int не преобразуется. 2 + 2L = 4L
>>> import struct
>>> BYTES = '<4B'
>>> INT = '<i'
>>>
>>> s = struct.pack(BYTES, 0xff, 0xff, 0xff, 0xff)
>>> s
'\xff\xff\xff\xff'
>>> i, = struct.unpack(INT, s)
>>> i
-1



Офлайн

#6 Авг. 12, 2009 19:05:56

mks
От:
Зарегистрирован: 2009-08-07
Сообщения: 80
Репутация: +  5  -
Профиль   Отправить e-mail  

Вывод знаковых чисел. проблема.

Просто с синтаксисом struct так и не смог разобратся и пошел по пути наименьшего сопротивления. А за пример спасибо =).



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version