Python: Перевод чисел в HEX, деление пополам и обратно в dec

Рейтинг: -2Ответов: 2Опубликовано: 21.02.2023

Умельцы, помогите. Есть текстовый файл с такими строками (в общем там около 50 000 строк):

"name1": 1735166787988,

"name2": 602,

"name1": 2276332667410,

"name2": 606,

"name1": 3680786973529,

"name2": 902,

"name1": 3869765534597,

"name2": 821,

"name1": 551014239434021,

"name2": 983,

"name1": 2135457740068400,

"name2": 428,

"name1": 3022888177941837,

"name2": 655,

"name1": 288880372274581291,

"name2": 881,

"name1": 8590887058832684611,

Нужен скрипт на Питоне, чтобы в этом файле числа "name1" конвертировались в 16тиричную систему, затем делились на две части, одна из которых удалялась бы, а другая конвертировались обратно в десятичные и записывалась вместо числа "name1".

Например первое число "1735166787988". в hex это будет "0000019400000194" делим пополам, одну часть удаляем, одну оставляем (эти две части всегда одинаковые): "00000194" - теперь это число нужно обратно перевести в десятичные = 404 (этот конечный результат нужен в графе name1)

Другие примеры: 2276332667410 => 0000021200000212 => 00000212 => 530

8590887058832684611 => 7738F6437738F643 => 7738F643 => 2000221763

и т.д.

🙏🙏🙏

Ответы

▲ 0Принят

Ссылаясь на действенное объяснение пользователя, код может выглядеть следующим образом.

with open('hex_dec.txt', 'r') as f:
    lines = f.readlines()

for i in range(0, len(lines), 2):
    if lines[i].startswith('"name1":'):
        name1 = int(lines[i].split(':')[1].strip().rstrip(','))
        hex_value = hex(name1)[2:].zfill(16)
        half_hex_value = hex_value[:8]
        new_name1 = int(half_hex_value, 16)
        lines[i] = f'"name1": {new_name1},\n'

        # решение задачи, описанной в примере
        remainder = new_name1 % 2**32
        lines[i] = f'"name1": {remainder},\n'

with open('hex_dec.txt', 'w') as f:
    f.writelines(lines)

Конечный результат по Вашим входящим данным, будет иметь следующий вид: введите сюда описание изображения

P.s. Чтобы не потерять значения "name2" в текстовом документе, я внес условие if. Вполне вероятно, что в Вашей задаче это может быть реализовано немного по иному.

▲ 1

Скрипт ниже читает входной поток по строкам, отыскивает числа внутри строк (все числа), заменяет их на остаток по модулю 232:

import sys
import re

for line in sys.stdin:
    sys.stdout.write(
        re.sub('\\d+', lambda m: str(int(m.group(0)) % 2 ** 32), line)
    )

Применять так:

$ python cut_numbers.py < input.txt > output.txt