Книга: UNIX: разработка сетевых приложений
3.5. Функции управления байтами
Разделы на этой странице:
3.5. Функции управления байтами
Существует две группы функций, работающих с многобайтовыми полями без преобразования данных и без интерпретации их в качестве строк языка С с завершающим нулем. Они необходимы нам при обработке структур адресов сокетов, поскольку такие поля этих структур, как IP-адреса, могут содержать нулевые байты, но при этом не являются строками С. Строки с завершающим нулем обрабатываются функциями языка С, имена которых начинаются с аббревиатуры str
. Эти функции подключаются с помощью файла <string.h>
.
Первая группа функций, названия которых начинаются с b (от слова «byte» — «байт»), взяты из реализации 4.2BSD и все еще предоставляются практически любой системой, поддерживающей функции сокетов. Вторая группа функций, названия которых начинаются с mem
(от слова «memory» — память), взяты из стандарта ANSI С и доступны в любой системе, обеспечивающей поддержку библиотеки ANSI С.
Сначала мы представим функции, которые берут начало от реализации Беркли, хотя в книге мы будем использовать только одну из них — bzero
. (Дело в том, что она имеет только два аргумента и ее проще запомнить, чем функцию memset
с тремя аргументами, как объяснялось в разделе 1.2.) Две другие функции, bcopy
и bcmp
, могут встретиться вам в существующих приложениях.
#include <strings.h>
void bzero(void *dest, size_t nbytes);
void bcopy(const void *src, void *dest, size_t nbytes);
int bcmp(const void *ptr1, const void *ptr2, size_t nbytes);
Возвращает: 0 в случае равенства, ненулевое значение в случае неравенства
ПРИМЕЧАНИЕ
Мы впервые встречаемся со спецификатором const. В приведенном примере он служит признаком того, что значения, на которые указывает указатель, то есть src, ptr1 и ptr2, не изменяются функцией. Другими словами, область памяти, на которую указывает указатель со спецификатором const, считывается функцией, но не изменяется.
Функция bzero
обнуляет заданное число байтов в указанной области памяти. Мы часто используем эту функцию для инициализации структуры адреса сокета нулевым значением. Функция bcopy
копирует заданное число байтов из источника в место назначения. Функция bcmp
сравнивает две произвольных последовательности байтов и возвращает нулевое значение, если две байтовых строки идентичны, и ненулевое — в противном случае.
Следующие функции являются функциями ANSI С:
#include <string.h>
void *memset(void *dest, int c, size_t len);
void *memcpy(void *dest, const void *src, size_t nbytes);
int memcmp(const void *ptr1, const void *ptr2, size_t nbytes);
Возвращает: 0 в случае равенства, значение <0 или >0 в случае неравенства (см. текст)
Функция memset
присваивает заданному числу байтов значение с. Функция memcpy
аналогична функции bcopy
, но имеет другой порядок двух аргументов. Функция bcopy
корректно обрабатывает перекрывающиеся поля, в то время как поведение функции memcpy
не определено, если источник и место назначения перекрываются. В случае перекрывания полей должна использоваться функция ANSI С memmove
(упражнение 30.3).
ПРИМЕЧАНИЕ
Чтобы запомнить порядок аргументов функции memcpy, подумайте о том, что он совпадает с порядком аргументов в операторе присваивания (справа — оригинал, слева — копия).
dest = src;
Последним аргументом этой функции (как и всех ANSI-функций memXXX) всегда является длина области памяти.
Функция memcmp
сравнивает две произвольных последовательности байтов и возвращает нуль, если они идентичны. В противном случае знак возвращаемого значения определяется знаком разности между первыми несовпадающими байтами, на которые указывают ptr1 и ptr2. Предполагается, что сравниваемые байты принадлежат к типу unsigned char
.
- 3.1. Введение
- 3.2. Структуры адреса сокетов
- 3.3. Аргументы типа «значение-результат»
- 3.4. Функции определения порядка байтов
- 3.5. Функции управления байтами
- 3.6. Функции inet_aton, inet_addr и inet_ntoa
- 3.7. Функции inet_pton и inet_ntop
- 3.8. Функция sock_ntop и связанные с ней функции
- 3.9. Функции readn, writen и readline
- 3.10. Резюме
- Упражнения
- Основные "рычаги" управления производительностью
- Категорийный менеджмент. Курс управления ассортиментом в рознице
- Аргументы функции в Python
- 3. Функции
- Новые функции API для работы с Blob и массивами
- 1. Системы управления базами данных
- 4.8 Методы управления Fibre Channel
- Математические функции
- 7.9 Будущее управления хранилищами по версии ассоциации SNIA: стандарты SMI
- 15.1.3. Обработка сигналов управления заданиями
- Группа управления конфигурацией ПО
- Размытые функции