Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99

Реализовать разбор двоичного формата данных

28.05.2023, 19:58. Показов 2020. Ответов 10

Студворк — интернет-сервис помощи студентам
Добрый вечер, уважаемые форумчане.
Есть у меня вот такаязадача - написать код на python (должна быть 1 функция main и только она одна (чокнутое требование препода)) в формате PEP8, который решает задачу:

Реализовать разбор двоичного формата данных. Данные начинаются с сигнатуры 0x56 0x42 0x49 0x75, за которой следует структура A. Порядок байт: от старшего к младшему. Адреса указаны в виде смещений от начала данных. В решении предлагается использовать модуль struct.

Структура A:
 
Поле Описание
1 Размер (uint16) и адрес (uint32) массива структур B
2 double
3 Массив uint16, размер 6

Структура B:
 
Поле Описание
1 int32
2 uint64
3 Адрес (uint16) структуры C

Структура C:
 
Поле Описание
1 Структура D
2 uint64
3 uint32
4 int64

Структура D:
 
Поле Описание
1 Массив double, размер 2
2 Массив uint8, размер 6

(Прошу прощения, не понял как на форуме таблицы работают, а до сих пор не сталкивался)

Ниже показаны примеры разбора двоичного формата.

Пример 1:
Входные данные:

(b'VBIu\x00\x02\x00\x00\x00r?\xb8\x05\xb 4\xc7V!@\xca\x08\xd7bG\x16\xe8\xea\x0bq'
b'!\xad?\xc6\x85\xea\xfa\xdc?\x18?\xe6\x b6\xd8u \xaa\xdcz\x9f\xa8\x06\xe3n'
b'm\x06\x03\xd7\x1aF\xe4\x8d\xbe\x14B_\x e0\xb2$\xff\xd5\xf9\x05\xc9'
b'\xbf\xb6\x9f\xff\r\xb1\xf9\xf0?\xe12v\ xce\xa9\xccV\x1b\x845v\xaf\x83\x0f\xa9'
b'%\x13C=\xe9\xdd\x08y\xd1A=\x83\x03\xdb \xe9j\x05a\x90\x1768N\x8e\x0e\xda\x05j'
b'\xdd\xdf\x00\x1e.%\x89`\x92m\x92\xdbR\ xa5\xce^\x00H')

Выходные данные:

JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{'A1': [{'B1': -1877526984,
         'B2': 5660478111207841247,
         'B3': {'C1': {'D1': [0.1759618496803277, 0.7098200118683411],
                       'D2': [122, 159, 168, 6, 227, 110]},
                'C2': 7855970822388114573,
                'C3': 3188998751,
                'C4': -2255699782134069815}},
        {'B1': 774211936,
         'B2': 10551250972681031262,
         'B3': {'C1': {'D1': [-0.08837884983402211, 0.5374101673500131],
                       'D2': [27, 132, 53, 118, 175, 131]},
                'C2': 1128473946295757277,
                'C3': 142201153,
                'C4': 4432390701311460705}}],
 'A2': 0.09383706919300483,
 'A3': [51720, 55138, 18198, 59626, 2929, 8621]}


Пример 2:
Входные данные:

(b'VBIu\x00\x02\x00\x00\x00r\xbf\xedE_\x ff\xc8\xfb\x82s\xe0\x87\x80\x84\xf0'
b'\x98\xb0\xb6C\xd9c\xbf[_\x8e\xc0\xd1T\x00\xbf\xec\x8b\x07\x0fMW B\xa4#'
b'By\xee\x85\xb0\xccC8J0\xb3\xad\x99\xbc \xa6\xd6\xc5\x84nn\x05\x05\x185'
b'?\xd0\xae\x98r\xf4A\xd0?\xe8\xfe\xd1\x a3\t\x95\xa8\xbb\xf6b\x93\x0er\x80\xa5'
b"a\xed\x9a\x08h>\\\xa7\xcb6\xca'\xee\xb 5\xddP\xb7H\x85i\xf1\x1a\xb6\xd8"
b'\xf1;#_\xb1y\x00\x1e\xe6\xfa\xee\x143| le\xaeE\xb2\x9b\x00H')

Выходные данные:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{'A1': [{'B1': -2056654566,
         'B2': 13175545946171224441,
         'B3': {'C1': {'D1': [-0.0016707319330369064, -0.8919711398000134],
                       'D2': [164, 35, 66, 121, 238, 133]},
                'C2': 12739631354966225837,
                'C3': 2579277526,
                'C4': -4214121932502263755}},
        {'B1': -419762668,
         'B2': 3709959377017746075,
         'B3': {'C1': {'D1': [0.260656463870899, 0.7811058220219609],
                       'D2': [187, 246, 98, 147, 14, 114]},
                'C2': 9269923081131419710,
                'C3': 1554500406,
                'C4': -3879870089086847160}}],
 'A2': -0.9147186275293822,
 'A3': [29664, 34688, 34032, 39088, 46659, 55651]}
Вот такие пироги, уважаемые форумчане. Сам попробовал решить, мучаюсь уже неделю. Написал вот такой вот код:
Кликните здесь для просмотра всего текста


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import struct
 
def main(data):
    result = {}
 
    # Проверяем сигнатуру
    if data[:4] != b'\x56\x42\x49\x75':
        raise ValueError("Invalid signature")
 
    # Читаем размер и адрес массива структур B
    size, address = struct.unpack('>IH', data[4:9])
    result['A1'] = []
 
    # Читаем данные структур B
    for _ in range(size):
        b_data = data[address:]
        b_result = {}
 
        # Читаем поля структуры B
        b_result['B1'], b_result['B2'], c_address = struct.unpack(
            '>qiH', b_data[:14])
 
        # Читаем структуру C
        c_data = data[c_address:]
        c_result = {}
 
        # Читаем структуру D
        d_data = c_data[2:]
        d_result = {}
        d_result['D1'] = struct.unpack('>2d', d_data[:16])
        d_result['D2'] = struct.unpack('>6B', d_data[16:22])
 
        # Записываем структуру D в структуру C
        c_result['C1'] = d_result
 
        # Читаем оставшиеся поля структуры C
        c_result['C2'], c_result['C3'], c_result['C4'] = struct.unpack(
            '>HIL', c_data[22:33])
 
        # Записываем структуру C в структуру B
        b_result['B3'] = c_result
 
        # Записываем структуру B в список
        result['A1'].append(b_result)
 
        # Переходим к следующей структуре B
        address += 22
 
    # Читаем оставшиеся поля структуры A
    result['A2'] = struct.unpack('>d', data[address:address + 8])[0]
    result['A3'] = struct.unpack('>6H', data[address + 8:address + 20])
 
    return result

но в системе, куда загружаю задачу, он выдает ошибку:
Подробные сведения об ошибке:
Получено:


Входные данные:
b'VBIu\x00\x02\x00\x00\x00r?\xb8\x05\xb4 \xc7V!@\xca\x08\xd7bG\x16\xe8\xea\x0bq!\ xad?\xc6\x85\xea\xfa\xdc?\x18?\xe6\xb6\x d8u \xaa\xdcz\x9f\xa8\x06\xe3nm\x06\x03\xd7\ x1aF\xe4\x8d\xbe\x14B_\xe0\xb2$\xff\xd5\ xf9\x05\xc9\xbf\xb6\x9f\xff\r\xb1\xf9\xf 0?\xe12v\xce\xa9\xccV\x1b\x845v\xaf\x83\ x0f\xa9%\x13C=\xe9\xdd\x08y\xd1A=\x83\x0 3\xdb\xe9j\x05a\x90\x1768N\x8e\x0e\xda\x 05j\xdd\xdf\x00\x1e.%\x89`\x92m\x92\xdbR \xa5\xce^\x00H'

Сообщение об ошибке интерпретатора:
Traceback (most recent call last):
File "/home/program.py", line 25, in <module>
result = main(*args)
File "<string>", line 12, in main
struct.error: unpack requires a buffer of 6 bytes



Если кто вдруг знает как пофиксить ошибку или может порекомендовать другой способ решения или любую информацию по теме, буду очень сильно благодарен
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.05.2023, 19:58
Ответы с готовыми решениями:

Реализовать разбор двоичного формата данных
Дано задание: Реализовать разбор двоичного формата данных. Данные начинаются с сигнатуры 0x44 0x52 0x58 0x42, за которой следует...

Реализовать разбор двоичного формата данных
Всем привет. Прошу помочь реализовать разбор двоичного формата данных. Данные начинаются с сигнатуры 0x4d 0x51 0x51, за которой следует...

Реализовать разбор двоичного формата данных
Реализовать разбор двоичного формата данных. Данные начинаются с сигнатуры 0x4b 0x49 0x50 0x5d, за которой следует структура A. Порядок...

10
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
28.05.2023, 21:22
Цитата Сообщение от daniil_novel Посмотреть сообщение
Если кто вдруг знает как пофиксить ошибку
В слайсах правая граница не включается
1
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
28.05.2023, 21:29  [ТС]
А как ее включить?
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
28.05.2023, 21:31
Python
1
data[4:9]
Сколько здесь байт?
Сколько нужно?
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
28.05.2023, 21:34  [ТС]
Сейчас он распаковывает 6 байт. Первые 4 байта будут интерпретированы как беззнаковое целое (I), представляющее размер.
Следующие 2 байта будут интерпретированы как беззнаковое короткое целое (H), представляющее адрес
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
28.05.2023, 21:35
daniil_novel, вы о чем то о своем. Я задал 2 простых вопроса
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
28.05.2023, 21:58  [ТС]
Я, честно говоря, не очень их понял. В массиве у нас 6 байт. Вроде, столько и нужно

Добавлено через 11 минут
Цитата Сообщение от Red white socks Посмотреть сообщение
Я задал 2 простых вопроса
Теперь понял. Там 5 байт, а должно быть 6

Добавлено через 2 минуты
Исправил, только вот это не помогает. Все равно вылазит ошибка интерпретатора, которая просит теперь уже или 10 или 16 байт
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
28.05.2023, 22:55
Так 10 или 16? В какой строке?

Наверное стоит дать ему, сколько просит? Или есть другие варианты?
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
28.05.2023, 23:16  [ТС]
Цитата Сообщение от Red white socks Посмотреть сообщение
Так 10 или 16? В какой строке?
В строке ошибки. Тут, я так понимаю, вообще не в количестве байт буфера дело. Я сам алгоритм сделал неправильно походу

Добавлено через 4 минуты
Цитата Сообщение от Red white socks Посмотреть сообщение
Так 10 или 16?
Компилятор пишет, что 16

Code
1
2
3
4
5
6
7
8
9
Входные данные:
b'VBIu\x00\x02\x00\x00\x00r?\xb8\x05\xb4\xc7V!@\xca\x08\xd7bG\x16\xe8\xea\x0bq!\xad?\xc6\x85\xea\xfa\xdc?\x18?\xe6\xb6\xd8u \xaa\xdcz\x9f\xa8\x06\xe3nm\x06\x03\xd7\x1aF\xe4\x8d\xbe\x14B_\xe0\xb2$\xff\xd5\xf9\x05\xc9\xbf\xb6\x9f\xff\r\xb1\xf9\xf0?\xe12v\xce\xa9\xccV\x1b\x845v\xaf\x83\x0f\xa9%\x13C=\xe9\xdd\x08y\xd1A=\x83\x03\xdb\xe9j\x05a\x90\x1768N\x8e\x0e\xda\x05j\xdd\xdf\x00\x1e.%\x89`\x92m\x92\xdbR\xa5\xce^\x00H'
 
Сообщение об ошибке интерпретатора:
Traceback (most recent call last):
  File "/home/program.py", line 25, in <module>
    result = main(*args)
  File "<string>", line 31, in main
struct.error: unpack requires a buffer of 16 bytes
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
29.05.2023, 06:38
Лучший ответ Сообщение было отмечено daniil_novel как решение

Решение

Цитата Сообщение от daniil_novel Посмотреть сообщение
Я сам алгоритм сделал неправильно походу
Тут сложно не согласиться.

Причем я бы сказал, что дело и не в алгоритме.
Давайте по порядку начнем. Структура А.
# Читаем размер и адрес массива структур B
Цитата Сообщение от daniil_novel Посмотреть сообщение
Первые 4 байта будут интерпретированы как беззнаковое целое (I), представляющее размер.
Следующие 2 байта будут интерпретированы как беззнаковое короткое целое (H), представляющее адрес
Почему на размер вы берете 4 байта, а на адрес 2? Как рассчитали?
0
1 / 1 / 0
Регистрация: 19.03.2022
Сообщений: 99
29.05.2023, 17:05  [ТС]
Готово. Пришлось все переделать, но я справился. Вот итоговое решение
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
from struct import unpack_from, calcsize
from typing import Any, Callable
 
 
class Types:
    char = 'c'
    int8 = 'b'
    uint8 = 'B'
    int16 = 'h'
    uint16 = 'H'
    int32 = 'i'
    uint32 = 'I'
    int64 = 'q'
    uint64 = 'Q'
    float = 'f'
    double = 'd'
 
 
class BinaryReader:
    def __init__(self, stream, offset, order=">"):
        self.stream = stream
        self.offset = offset
        self.order = order
 
    def jump(self, offset):
        reader = BinaryReader(self.stream, offset, self.order)
        return reader
 
    def read(self, pattern):
        size = calcsize(pattern)
        data = unpack_from(self.order + pattern, self.stream, self.offset)
        self.offset += size
        return data[0]
 
 
def read_d(reader):
    d1 = [reader.read(Types.double) for _ in range(2)]  # Чтение значения типа
    # double
    d2 = [reader.read(Types.uint8) for _ in range(6)]  # Чтение значения типа
    # uint8
    return dict(D1=d1, D2=d2)  # Возв
 
 
def read_c(reader):
    c1 = read_d(reader)  # Вызов функции read_d для чтения структуры D
    c2 = reader.read(Types.uint64)  # Чтение значения типа uint64
    c3 = reader.read(Types.uint32)  # Чтение значения типа uint32
    c4 = reader.read(Types.int64)  # Чтение значения типа int64
    return dict(C1=c1, C2=c2, C3=c3, C4=c4)  # Возврат словаря
 
 
def read_b(reader):
    b1 = reader.read(Types.int32)  # Чтение значения типа int32
    b2 = reader.read(Types.uint64)  # Чтение значения типа uint64
    b3_offset = reader.read(Types.uint16)  # Чтение значения типа uint1
    b3_reader = reader.jump(b3_offset)  # Создание нового экземпляра Bina
    b3 = read_c(b3_reader)  # Чтение 6 структур C с использо
    return dict(B1=b1, B2=b2, B3=b3)  # Возврат словаря с ключ
 
 
def read_a(reader):
    b_size = reader.read(Types.uint16)  # Чтение значения типа uint1
    b_offset = reader.read(Types.uint32)  # Чтение значения типа uint32 дл
    b_reader = reader.jump(b_offset)  # Создание нового экземпляра Binary
    a1 = [read_b(b_reader) for _ in range(b_size)]
    a2 = reader.read(Types.double)  # Чтение значения типа double
    a3 = [reader.read(Types.uint16) for _ in range(6)]  # Чтение 6 значе
    return dict(A1=a1, A2=a2, A3=a3)  # Возврат словаря с ключами 'A1',
 
 
def main(stream):
    return read_a(BinaryReader(stream, 4))
 
 
x = (
    b'VBIu\x00\x02\x00\x00\x00r?\xb8\x05\xb4\xc7V!@\xca\x08\xd7bG\x16\xe8\xea'
    b'\x0bq'
    b'!\xad?\xc6\x85\xea\xfa\xdc?\x18?\xe6\xb6\xd8u \xaa\xdcz\x9f\xa8\x06\xe3n'
    b'm\x06\x03\xd7\x1aF\xe4\x8d\xbe\x14B_\xe0\xb2$\xff\xd5\xf9\x05\xc9'
    b'\xbf\xb6\x9f\xff\r\xb1\xf9\xf0?\xe12v\xce\xa9\xccV\x1b\x845v\xaf\x83\x0f\xa9'
    b'%\x13C=\xe9\xdd\x08y\xd1A=\x83\x03\xdb\xe9j\x05a\x90\x1768N\x8e\x0e\xda\x05j'
    b'\xdd\xdf\x00\x1e.%\x89`\x92m\x92\xdbR\xa5\xce^\x00H')
 
result = main(x)
print(result)



Дело было не алгоритме, а в некорректных вопросах к нему
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.05.2023, 17:05
Помогаю со студенческими работами здесь

Реализовать разбор двоичного формата данных
Данные начинаются с сигнатуры 0x31 0x56 0x4f 0x5a, за которой следует структура A. Порядок байт: от младшего к старшему. Адреса указаны в...

Реализовать на Python разбор двоичного формата данных
Реализовать разбор двоичного формата данных. Данные начинаются с сигнатуры 0xd 0x4c 0x58 0x4a, за которой следует структура A. Порядок...

Задача, реализовать разбор двоичного формата данных, но программа не работает
Данные начинаются с сигнатуры 0x31 0x56 0x4f 0x5a, за которой следует структура A. Порядок байт: от младшего к старшему. Адреса указаны в...

Разбор формата *.id
Кто-нибудь сталкивался с задачей расковырять *.ID Файл и вытащить от туда имя пользователя? Открыт ли формат ?

Разбор программы.Перевод двоичного числа в десятичн
char bin // изображение двоичного числа, почему именно так и что такое bin? нигде не могу найти long int dec //десятичное число, что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru