Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lr2.doc
Скачиваний:
1
Добавлен:
08.11.2019
Размер:
235.52 Кб
Скачать

4.2. 4.2. Функция распаковки

Нам будут нужны такие же переменные, что и в функции упаковки.

Алгоритм состоит из таких шагов.

1. Ввод значения слова состояния устройства.

2. Выделение из слова состояния устройства кода состояния. Код слова состояния устройства нужно сдвинуть на 11 разрядов вправо и выделить 5 младших разрядов - "побитовое логическое И" с константой 1F16. Слово состояния устройства остается неизменным, а полученное значение записывается в переменную для кода состояния.

c=(UnitStateWord>>11)&0x1F;

3. Выделение из слова состояния устройства признака ошибки. Код слова состояния устройства сдвинуть на 9 разрядов вправо и выделить 1 младший разряд - "побитовое логическое И" с константой 1. Слово состояния устройства остается неизменным, а полученное значение записывается в переменную для признака ошибки.

f=(UnitStateWord>>9)&1;

4. Выделение из слова состояния устройства признака занятости. Код слова состояния устройства сдвинуть на 9 разрядов вправо и выделить 1 младший разряд. Слово состояния устройства остается неизменным, а полученное значение записывается в переменную для признака занятости.

b=(UnitStateWord>>8)&1;

5. Выделение из слова состояния устройства количества байт. В коде слова состояния устройства нужно выделить 8 младших разрядов - "побитовое логическое И" с константой FF16. Полученное значение записывается в переменную для количества байт.

n=UnitStateWord&0xFF;

Результаты работы программы

user@user-00:~$ ./lr2 -p

Введите код состояния (0 - 31) >22

Введите признак ошибки (0 / 1) >1

Введите признак занятости (0 / 1) >0

Введите кол-во переданных байт (0 - 255) >145

Слово состояния устройства = b291

user@user-00:~$ ./lr2 -u

Введите cлово состояния устройства

(16-ричное число от 0 до 0xFFFF) >b291

Код состояния = 22

Признак ошибки = 1

Признак занятости = 0

Количество переданных байт = 145

user@user-00:~$ ./lr2 -z

некорректная опция

user@user-00:~$ ./lr2

вызов: ./lr2 [опция] /n опции:

-p: упаковка;

-u: распаковка

Приложение а (справочное) Текст программы

#include <stdio.h>

int pack(void);

int unpack(void);

int main(int argc, char *argv[])

{

if (argc == 2)

switch(argv[1][1])

{

case 'p': pack(); break;

case 'u': unpack(); break;

default : printf("некорректная опция\n");

}

else printf("вызов: %s [опция] /n опции:\n\t -p: упаковка;\n\t -u: распаковка\n",argv[0]);

return 0;

}

int pack(void)

{

unsigned c; /* код состояния */

unsigned f; /* признак ошибки */

unsigned b; /* признак занятости */

unsigned n; /* количество байт */

unsigned int UnitStateWord; /*слово состояния */

/* ввод составных частей */

printf("Введите код состояния (0 - 31) >");

scanf("%u",&c);

printf("Введите признак ошибки (0 / 1) >");

scanf("%u",&f);

printf("Введите признак занятости (0 / 1) >");

scanf("%u",&b);

printf("Введите кол-во переданных байт (0 - 255) >");

scanf("%u",&n);

/* формирование упакованного кода */

UnitStateWord=(c&0x1F)<<11;

UnitStateWord|=(f&1)<<9;

UnitStateWord|=(b&1)<<8;

UnitStateWord|=n&0xFF;

/* вывод результата */

printf("\nСлово состояния устройства = %04x\n", UnitStateWord);

return 0;

}

int unpack(void)

{

unsigned c; /* код состояния */

unsigned f; /* признак ошибки */

unsigned b; /* признак занятости */

unsigned n; /* количество байт */

unsigned int UnitStateWord; /* слово состояния*/

/* ввод слова состояния устройства */

printf("Введите cлово состояния устройства \n");

printf("(16-ричное число от 0 до 0xFFFF) >");

scanf("%x",&UnitStateWord);

/* Выделение составных частей */

c=(UnitStateWord>>11)&0x1F;

f=(UnitStateWord>>9)&1;

b=(UnitStateWord>>8)&1;

n=UnitStateWord&0xFF;

/* вывод результатов */

putchar('\n');

printf("Код состояния = %u\n",c);

printf("Признак ошибки = %u\n",f);

printf("Признак занятости = %u\n",b);

printf("Количество переданных байт = %u\n",n);

return 0;

}

* Для создания и монтирования общей папки необходимо выполнить следующие действия:

В меню «Устройства» виртуальной машины выбрать пункт «Общие папки» и добавить папку e:\VM\Share

В командной строке Linux ввести следующие команды.

Для перехода в режим суперпользователя su. Пароль: user

Для монтирования папки mount –t vboxsf share /mnt/share

Для выхода из режима суперпользователя exit

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]