Программы
Union – Объединения в Си

Union – Объединения в Си

Опять же довольно уникальная фишка Си – возможность смотреть на одни и те же байты по-разному

Объединения в Си похожи на структуры, однако поля, объявленные в них, имеют начало на одном и том же адресе. То есть это возможность манипулировать одними и теми же данными с помошью разных их представлений.

Например, с float и int:

#include <stdio.h>

union floatint{
  float f;
  int i;
};

int main() {
  // Устанавливаем значение через представление "f" (float)
  union floatint u = { 10.f };

  printf("%f\n", u.f);
  printf("%x\n", u.i);

  return 0;
}

Это довольно занятно, но интереснее делать объединения структур! Так мы можем работать с одной и той-же памятью, но в разных её интерпретациях. Например, мы можем попытаться работать с 32-мя битами как с:

  1. 4-мя байтами,
  2. 2-мя машинными словами,
  3. 1-им двойным машинным словом.
#include <stdio.h>

typedef union Register32 {
    struct {
        unsigned char byte1;
        unsigned char byte2;
        unsigned char byte3;
        unsigned char byte4;
    } bytes;
    struct {
        unsigned short low;
        unsigned short high;
    } words;
    unsigned dword;
} Register32;

int main() {
    Register32 reg;
    reg.dword = 0x0000C0FF;

    printf("    dword \t%08x\n", reg.dword);
    printf(" low word \t%04x\n", reg.words.low);
    printf("high word \t%04x\n", reg.words.high);
    printf("    byte1 \t%02x\n", reg.bytes.byte1);  
    printf("    byte2 \t%02x\n", reg.bytes.byte2);  
    printf("    byte3 \t%02x\n", reg.bytes.byte3);  
    printf("    byte4 \t%02x\n", reg.bytes.byte4);  
    
    return 0;
}

TODO: добавить пример по работе с TCP/UDP заголовками через объединение.

ДЗ

Написать на C API функцию Python3 получающую по объекту его счётчик ссылок.

Также может быть вам интересно:

Битовые поля в Си

Довольно уникальная для ЯП фишка Си – битовые поля структур

Читать »

Модель памяти Си

Ещё раз вспомним, что в Си всё байты. Но как мы их храним? А как вообще можно?

Читать »
Фото Как сделать свою middleware в Django (с примерами)

Как сделать свою middleware в Django (с примерами)

Middleware или "промежуточное программное обеспечение" - элегантный способ установить общие правила обработки запросов и ответов приложения. Давайте напишем парочку middleware, чтобы понять, как они работают.

Фото Как настроить отправку почты из Django

Как настроить отправку почты из Django

Письма об ошибках, отчёты на почту, восстановление паролей - всё это полезно при работе с сайтом. Django предоставляет удобный способ это сделать с минимумом настроек!

Фото Добавляем поддержку медиа-файлов в Django проект

Добавляем поддержку медиа-файлов в Django проект

Современные сайты редко ограничиваются только текстом и вёрсткой. Часто в заметках красуются фотографии, а рядом с описанием товаров - их изображения.

Фото Настройка журналирования (логирования) в Python с примерами

Настройка журналирования (логирования) в Python с примерами

Во время работы программы часто нужно сохранять некоторые важные записи о процессе выполнения команды. В Python есть довольно мощный модуль для работы с логами - давайте разберёмся с тем, как его использовать.

Фото Нет слов, одни... однострочники

Нет слов, одни... однострочники

На днях вышел пост со списком полезных однострочников для JavaScript программистов. Памятуя Perl-овую молодость, заглянул туда.

Фото Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

Добавляем переменные в контекст Django шаблонов (свой контекст-процессор)

В Django вы можете передавать данные в шаблоны посредством контекстов. Контекст передаётся из контроллера (view в терминах Django), однако, если одни и те же данные нужны в разных местах, лучше сделать свой контекст-процессор.

Фото Пример своей консольной команды в Django проекте

Пример своей консольной команды в Django проекте

Если вы работали с Django проектом, то, скорее всего, запускали команды из консоли (manage.py). В Django есть простой способ писать свои команды для управления проектом.

Фото Разграничение прав доступа на Django сайте

Разграничение прав доступа на Django сайте

Почти на любом веб-сайте необходимо разделять пользователей на группы и предоставлять им разные возможности. В Django есть довольно серьёзная система прав доступа для пользователей - давайте её рассмотрим!