Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 28, 2019 14:02:01

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Поиск возможных комбинаций бинарных данных

py.user.next
Ясно, спасибо. Как всегда, учиться приходится долго, а хочется всего и сразу :-)

Не все данные являются чистыми; во многих данных наряду с чистыми участками лежит мусор, который не используется, который там для забивки пространства.
Ну, конкретно в данном случае “свободное” место просто нулями забивается.
Вот ты знаешь, что они просто могут различаться? Это маловероятно, что ты это знаешь.
Знаю, в struct.unpack используют ‘<’ и ‘>’ для этого. Но сами эти понятия мне действительно мало о чем говорят.
И вот чтобы это всё знать, это нужно начинать с простых учебных задачек про работу с битами через битовые операции.
Кстати, можете подсказать, что значит следующее:
 int code=791651;
packed_code[0] = code & 0x0000ff;
packed_code[1] = (code & 0x00ff00)>>8;
packed_code[2] = (code & 0xff0000)>>16;
Код на C++, но инструкции после корректировки синтаксиса работают и в Python.

Отредактировано vanvanov (Ноя. 28, 2019 14:04:18)

Офлайн

#2 Ноя. 28, 2019 20:19:49

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Поиск возможных комбинаций бинарных данных

Без знания С распаковывать данные практически невозможно. Питон для этого использует по сути сишные подходы. Приведенная конструкция элементарна. В одном целом числе хранится три целых числа по одному байту их вырезают битовой маской и побитово сдвигают чтобы поместить в обычные переменные.

Названия переменных неудачные code это как раз packed. packed_codes это как раз unpacked_codes



Отредактировано doza_and (Ноя. 28, 2019 20:22:32)

Офлайн

#3 Ноя. 29, 2019 02:52:08

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10031
Репутация: +  857  -
Профиль   Отправить e-mail  

Поиск возможных комбинаций бинарных данных

vanvanov
Кстати, можете подсказать, что значит следующее:
int code=791651;
packed_code[0] = code & 0x0000ff;
packed_code[1] = (code & 0x00ff00)>>8;
packed_code[2] = (code & 0xff0000)>>16;
Это наложение битовых масок (для обнуления битов) и взятие определённых частей числа в битовом представлении.

Например
code & 0x0000ff
Это выражение можно записать
code & 0xff
code & 256
И что оно делает: берётся значение из code и представляется в двоичной форме в виде нулей и единиц; берётся значение 0x0000ff и представляется в двоичной форме в виде нулей и единиц; затем над этими двоичными формами проводится операция побитового И.

К примеру, в code было число 12345, его двоичная форма будет 11000000111001, а для числа 0x0000ff двоичная форма будет 11111111 (если слева брать шире, то там будут нули). В итоге мы ставим друг напротив друга эти два числа в двоичной форме
11000000111001
00000011111111
и потом мы их побитово проводим через операцию И.

Операция И действует так:
0 И 0 даёт 0
0 И 1 даёт 0
1 И 0 даёт 0
1 И 1 даёт 1

Таким образом, мы в результате операции И получаем
11000000111001
И
00000011111111
=
00000000111001
Число 111001 в десятичной системе равно 57.
Таким образом, если code равно 12345, то code & 0x0000ff = 57. При этом часть 0x0000ff играет роль битовой маски. Почему она так называется - потому что она, как маска, накладывается на число и от числа остаётся только то, что прошло вокруг маски и не прошло всё то, что маска закрыла собой.

Дальше я тебе расписывать не буду, так как это азбучные истины. Я тебе лучше книжку дам правильную, если тебе эта тема интересна, как и нам всем.

Я это узнал в 2008 году из книги K&R2, которую я заказал на Ozon'е (интернет-магазин такой) и которая по почте пришла мне с наложенным платежом (платишь прямо на почте при получении посылки)
wiki. книга

После неё вопросов про битовые операции у меня не осталось.


tags: bit



Отредактировано py.user.next (Ноя. 29, 2019 03:02:16)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version