LINUX.ORG.RU

Так что ли?

Помним, что в питоне безразмерные инты.

def my_sum(x, y):
	i = result = 0
	while x or y:
		result |= ((x + y) & 0x0f) << i
		x >>= 4
		y >>= 4
		i += 4

	return result

print(hex(my_sum(0xfffff0f0ffffffff, 0x111100001111)))

А вообще студенты уже совсем обнаглели.

ntp
()

оно почти один к одному переписывается на питоне. все эти >> << работают аналогично

VladimirMalyk ★★★★★
()
Ответ на: Так что ли? от ntp

Спасибо большое иммено то!!! Я тока учусь писать )))
Осталось тока переделать чтоб считать строку типа 025C3030303000333036004
Если кто поможет буду очень признателен!

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

Млин вообще не понимаю (((
Перед стоповым символом передается символ контроля блока (ВСС). BCC вычисляется сложением без переноса всех байтов посылки, без учета байта STX и представляет собой 1-байтовое число,передаваемое в формате итового поля.
STX = 0x02
К примеру 025F30303030003100303400000000423403
4234 - это и есть сумма, как млин ее вычислить
Мозг не варит вообще, первый раз столкнулся с таким!
Помогите плиз! Вышлю пиво по почте !!!!

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

1. 4234 — это никак не однобайтовое число.

2. Каждый символ посылки — байт или тетрада? Если тетрада — разбивай посылку по 2 символа, считай, что каждая пара — это HEX представление байта, и складывай. Если байт — бери его HEX из таблицы ASCII и складывай. В любом случае, лучше проделать сначала руками.

decadent
()
Ответ на: комментарий от decadent

Это как и сказали тетрада т.е. 5F - это и есть 0x5F да я взял строчку разбил по паре сложил тока у меня получилось совсем другое ((
5F 30 30 30 30 00 31 00 30 34 00 00 00 00
п.с. в доках написано BCC тип B Размер (2 байта)
Битовое (шестнадцатеричное) (B).
Битовое (шестнадцатеричное) поле представляет собой набор пар символов, которые передают один байт в ASCII представлении. Допустимыми символами для этого поля являются «0» ... «9» (ASCII 30H ... 39H), «A» ... «F» (ASCII 41H ... 46H), «a» ... «f» (ASCII 61H ... 66H). Длина поля различается в зависимости от конкретного применения. Пример: 27 - «1B»

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

Значит либо посылка составлена неверно, либо в доках что-то не то. Обратись к автору доки или к тому, кто тебе эти доки дал.

decadent
()
Ответ на: комментарий от paulig_by

> BCC ... представляет собой 1-байтовое число

в доках написано BCC тип B Размер (2 байта)



Турсы и крестик?

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

Битовое (шестнадцатеричное) поле представляет собой набор пар символов, которые передают один байт в ASCII представлении.
Вот мля как их понять )))
вот сама дока
http://dl.dropbox.com/u/325526/%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%...

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

я так понял что 42 34 - это B4

Тогда все просто. Складываешь нужные символы, в результате имеешь 0х01В4. Поскольку «сложение без переноса», то берешь последние 2 символа (АКА 1 байт), берешь HEX каждого из символов — и дописываешь к посылке.

decadent
()
Ответ на: комментарий от decadent

Вот правильно! Все всем большое спасибо все получается вроде! Вечером буду эксперементировать )))

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

> только long integers, plain - такого же размера как int на такой платформе

Простой int автоматически преобразуется к long int когда надо. А в python3 их вообще объединили.

Так что как ни крути, а инты в питоне безразмерные.

ntp
()
Ответ на: комментарий от ntp

> А в python3 их вообще объединили.

Неужто питон дорос до руби. :3

LamerOk ★★★★★
()

Жду мой кефир по почте.

В следующий раз сразу давай ссылку на документацию, а не на левый тред на ЛОРе.

# Это топикстартер привел как пример
message = '025F30303030003100303400000000423403'

# А вот это он на самом деле должен послать через rs232 в кассовый аппарат
message = ''.join(chr(int(message[i:i + 2], 16)) for i in xrange(0, len(message) - 1, 2))
print repr(message)

# Отбрасываем STX = 0x2 и ETX = 0x3
message = message[1:-1]

# Выделяем контрольную сумму
bcc = int(message[-2:], 16)
message = message[:-2]

# Вычисляем контрольную сумму сообщения
message_bcc = reduce(lambda result, x: (result + x) & 0xff, map(ord, message))

# Сравниваем
assert(bcc == message_bcc)

Кстати, по доке символы 24-27 должны быть не 0000, а 3030.

ntp
()
Ответ на: Жду мой кефир по почте. от ntp

Спасибо большое!
Кидай адресс вышлю кефира))
Но чтоб послать в порт то что мне надо я делаю так:
s = «025F30303030003100303400000000423403»
   ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)
   ser.write(binascii.a2b_hex(s))
   ser.close()
Вчера ковырял вроде пока все работает, но осталось самое гимморойное это составить фискальный документ! Хорошо что у меня есть выхлоп в ком порт из под виндовой программы, есть хоть счем сравнить.

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