Как сложить два шестнадцатеричных числа в python?
@ roma Вы можете использовать метод hex() для сложения шестнадцатеричных чисел.
firstnum = 'F4240' secondnum = '7A120' print(hex(int(firstnum, 16) + int(secondnum, 16))) # Вывод : 0x16e360
В Python вы можете сложить два шестнадцатеричных числа, используя функцию hex() для преобразования чисел из строкового формата в числовой формат, выполнить сложение и затем преобразовать результат обратно в шестнадцатеричный формат с помощью функции hex() .
Вот пример кода на Python, который сложит два шестнадцатеричных числа:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
a = "0x3f" b = "0x2a" # преобразуем числа в десятичный формат a_decimal = int(a, 16) b_decimal = int(b, 16) # складываем числа result_decimal = a_decimal + b_decimal # преобразуем результат обратно в шестнадцатеричный формат result_hex = hex(result_decimal) print(result_hex)
Этот код выведет результат сложения 0x3f и 0x2a в шестнадцатеричном формате:
Обратите внимание, что в Python шестнадцатеричные числа начинаются с префикса 0x , который указывает на то, что число записано в шестнадцатеричной системе счисления.
Так что ли?
Спасибо большое иммено то. Я тока учусь писать )))
Осталось тока переделать чтоб считать строку типа 025C3030303000333036004
Если кто поможет буду очень признателен!
Млин вообще не понимаю (((
Перед стоповым символом передается символ контроля блока (ВСС). BCC вычисляется сложением без переноса всех байтов посылки, без учета байта STX и представляет собой 1-байтовое число,передаваемое в формате итового поля.
STX = 0x02
К примеру 025F30303030003100303400000000423403
4234 — это и есть сумма, как млин ее вычислить
Мозг не варит вообще, первый раз столкнулся с таким!
Помогите плиз! Вышлю пиво по почте .
1. 4234 — это никак не однобайтовое число.
2. Каждый символ посылки — байт или тетрада? Если тетрада — разбивай посылку по 2 символа, считай, что каждая пара — это HEX представление байта, и складывай. Если байт — бери его HEX из таблицы ASCII и складывай. В любом случае, лучше проделать сначала руками.
Это как и сказали тетрада т.е. 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»
Значит либо посылка составлена неверно, либо в доках что-то не то. Обратись к автору доки или к тому, кто тебе эти доки дал.
я так понял что 42 34 — это B4
> BCC . представляет собой 1-байтовое число
в доках написано BCC тип B Размер (2 байта)
Битовое (шестнадцатеричное) поле представляет собой набор пар символов, которые передают один байт в ASCII представлении.
Вот мля как их понять )))
вот сама дока
http://dl.dropbox.com/u/325526/%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%.
я так понял что 42 34 — это B4
Тогда все просто. Складываешь нужные символы, в результате имеешь 0х01В4. Поскольку «сложение без переноса», то берешь последние 2 символа (АКА 1 байт), берешь HEX каждого из символов — и дописываешь к посылке.
Вот правильно! Все всем большое спасибо все получается вроде! Вечером буду эксперементировать )))
> только long integers, plain — такого же размера как int на такой платформе
Простой int автоматически преобразуется к long int когда надо. А в python3 их вообще объединили.
Так что как ни крути, а инты в питоне безразмерные.
> А в python3 их вообще объединили.
Неужто питон дорос до руби. :3
Жду мой кефир по почте.
В следующий раз сразу давай ссылку на документацию, а не на левый тред на ЛОРе.
# Это топикстартер привел как пример 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.
Спасибо большое!
Кидай адресс вышлю кефира))
Но чтоб послать в порт то что мне надо я делаю так:
s = «025F30303030003100303400000000423403»
ser = serial.Serial(‘/dev/ttyUSB0’, 9600, timeout=1)
ser.write(binascii.a2b_hex(s))
ser.close()
Вчера ковырял вроде пока все работает, но осталось самое гимморойное это составить фискальный документ! Хорошо что у меня есть выхлоп в ком порт из под виндовой программы, есть хоть счем сравнить.
Сложение чисел в шестнадцатеричной системе счисления.
Написать программу сложения и умножения двух шестнадцатеричных чисел. При этом каждое число представляется как массив, элементы которого это цифры числа. Например, пользователь ввёл A2 и C4F. Сохранить их как [‘A’, ‘2’] и [‘C’, ‘4’, ‘F’] соответственно. Сумма чисел из примера: [‘C’, ‘F’, ‘1’].
Возьмём пример поинтереснее, чем в условии. Предположим, нам на вход подаются значения в таком виде 2A2, FFD5F. Кстати, переводить их не за чем в списки. Ну если надо, то list(string) Вам в этом поможет.
first = input() second = input()
Если даже и приходят в другом виде, то преобразовать к такому, думаю, особого труда не составит.
Итак, создаём список из элементов 16-ричной системы
list_of_numbers = [str(i) for i in range(10)] + ['A', 'B', 'C', 'D', 'E', 'F']
Сравниваем 2 входных строки и выбираем большую для итераций по её символам.
if len(first) > len(second): first, second = second, first
Переворачиваем выбранную строку. Мне так удобней просто работать с ней.
и создаём третий список куда будем добавлять новые, найденные элементы.
Создаём вспомагательные переменные и запускаем цикл по большей строке. В нём находим индексы соответствующих элементов первой и второй строк в созданном ранее списке символов 16-ричной системы. Если у нас есть переход в другой разряд, то прибавляем k = 1, если нет, то k = 0. Чтоб не вывалится за границы, берём остаток от деления. C той же целью введён break.
1 2 3 4 5 6 7 8 9 10 11 12 13
j = -1 k = 0 for i in second: one = list_of_numbers.index(i) two = list_of_numbers.index(first[j]) third.append(list_of_numbers[(one + two + k) % 16]) if (one + two) >= 15: k = 1 else: k = 0 j -= 1 if j == -len(first)-1: break
Как только цикл закончен, проверям, отличались ли у нас вообще числа. Если да, то проходим по оставшимся символам большей строки и прибавляем их. Внимание! Тут нам приходится та же переменная k. Ведь могло быть такое, что последний элемент последней итерации предыдущего цикла перешёл в другой разряд. Мы это и учитываем благодаря переменной k.
diff = len(second) - len(first) if diff: for i in second[-diff:]: third.append(list_of_numbers[(list_of_numbers.index(second[-diff])+k)%16]) if list_of_numbers.index(second[-diff])+1 >=15: k = 1 else: k = 0
Ну и если после последний итерации этого цикла у нас число перешло в другой разряд, то просто добавляем ещё одну еденицу.
Числа: целые, вещественные, комплексные
Числа в Python 3: целые, вещественные, комплексные. Работа с числами и операции над ними.
Целые числа (int)
Числа в Python 3 ничем не отличаются от обычных чисел. Они поддерживают набор самых обычных математических операций:
x + y | Сложение |
x — y | Вычитание |
x * y | Умножение |
x / y | Деление |
x // y | Получение целой части от деления |
x % y | Остаток от деления |
-x | Смена знака числа |
abs(x) | Модуль числа |
divmod(x, y) | Пара (x // y, x % y) |
x ** y | Возведение в степень |
pow(x, y[, z]) | x y по модулю (если модуль задан) |
Также нужно отметить, что целые числа в python 3, в отличие от многих других языков, поддерживают длинную арифметику (однако, это требует больше памяти).
Над целыми числами также можно производить битовые операции
x | y | Побитовое или |
x ^ y | Побитовое исключающее или |
x & y | Побитовое и |
x | Битовый сдвиг влево |
x >> y | Битовый сдвиг вправо |
~x | Инверсия битов |
Дополнительные методы
int.bit_length() — количество бит, необходимых для представления числа в двоичном виде, без учёта знака и лидирующих нулей.
int.to_bytes(length, byteorder, *, signed=False) - возвращает строку байтов, представляющих это число.
int.from_bytes(bytes, byteorder, *, signed=False) - возвращает число из данной строки байтов.
Те, у кого в школе была информатика, знают, что числа могут быть представлены не только в десятичной системе счисления. К примеру, в компьютере используется двоичный код, и, к примеру, число 19 в двоичной системе счисления будет выглядеть как 10011. Также иногда нужно переводить числа из одной системы счисления в другую. Python для этого предоставляет несколько функций:
- int([object], [основание системы счисления]) — преобразование к целому числу в десятичной системе счисления. По умолчанию система счисления десятичная, но можно задать любое основание от 2 до 36 включительно.
- bin(x) — преобразование целого числа в двоичную строку.
- hex(х) — преобразование целого числа в шестнадцатеричную строку.
- oct(х) — преобразование целого числа в восьмеричную строку.
Вещественные числа поддерживают те же операции, что и целые. Однако (из-за представления чисел в компьютере) вещественные числа неточны, и это может привести к ошибкам:
Для высокой точности используют другие объекты (например Decimal и Fraction)).
Также вещественные числа не поддерживают длинную арифметику:
Простенькие примеры работы с числами:
float.as_integer_ratio() — пара целых чисел, чьё отношение равно этому числу.
float.is_integer() — является ли значение целым числом.
float.hex() — переводит float в hex (шестнадцатеричную систему счисления).
classmethod float.fromhex(s) — float из шестнадцатеричной строки.
Помимо стандартных выражений для работы с числами (а в Python их не так уж и много), в составе Python есть несколько полезных модулей.
Модуль math предоставляет более сложные математические функции.
В Python встроены также и комплексные числа:
: complex() Для работы с комплексными числами используется также модуль cmath.
Для вставки кода на Python в комментарий заключайте его в теги
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов