Что такое двоичные данные
Буферы, потоки и двоичные данные в Node.js
Автор статьи о буферах, потоках и двоичных данных в Node.js, перевод которой мы публикуем, говорит, что он понимает ощущения тех начинающих разработчиков, не имеющих специального образования, которым все эти сущности кажутся таинственными и непонятными. По его словам, это может заставить начинающих отложить в долгий ящик попытки разобраться со внутренними механизмами Node, сославшись на то, что всё это предназначено не для них, а лишь для профессионалов высшего класса, да для разработчиков пакетов. Сегодня он собирается исправить ситуацию и помочь всем желающим вникнуть в суть буферов, потоков и двоичных данных в Node.js и научиться со всем этим работать.
О внутренних механизмах Node
К сожалению, многие руководства и книги, посвящённые Node.js, не уделяют должного внимания внутренним механизмам этой платформы, не стремятся объяснить цель их существования. Как правило, в подобных публикациях всё сводится к рассказам о разработке веб-приложений с использованием готовых пакетов, без углубления в детали их реализации. А кое-где даже беспардонно заявляется, что читателю всё это понимать и не нужно, так как ему, скорее всего, никогда не придётся работать, скажем, с объектами класса Buffer, напрямую.
В официальной документации по Node.js о классе Buffer можно прочитать следующее:
До появления объекта TypedArray в ECMAScript 2015 (ES6), в JavaScript не было механизма для чтения потоков двоичных данных или для выполнения других операций с ними. Класс Buffer был представлен как часть API Node.js, позволяющая взаимодействовать с потоками произвольных двоичных данных в контексте, например, TCP-потоков и операций с файловой системой.
Да уж, если вы раньше не знали тех слов, которые встречаются в этом определении, то вы, возможно, воспримите его как маловразумительную кучу программистских жаргонизмов. Попробуем немного всё это упростить, перефразировав это определение, так, чтобы мы могли работать с ним, ни на что не отвлекаясь. Из этого определения можно вынести следующее:
Класс Buffer был представлен как часть API Node.js, позволяющая работать с потоками двоичных данных.
Итак, теперь всё выглядит немного проще. Но «класс Buffer», «потоки», «двоичные данные» — тут всё ещё слишком много непростых понятий. Попытаемся с ними разобраться, начав с последнего.
Что такое двоичные данные?
Возможно, вы уже знаете о том, что компьютеры хранят и представляют данные в двоичной форме. Двоичные данные — это просто набор единиц и нулей. Например, вот пять разных наборов двоичных данных, составленных из значений «1» и «0»:
Каждое число в двоичном значении, каждое значение «1» и «0» в наборе, называется битом (Bit, Binary digIT, двоичная цифра).
Для того чтобы работать с некими данными, компьютер должен преобразовать эти данные в их двоичное представление. Например, для того, чтобы сохранить десятичное число 12, компьютер должен преобразовать его в двоичную форму, а именно — в 1100.
Откуда компьютер знает, как производить подобные преобразования? Это — чистая математика. Это — двоичная система счисления, которую изучают в школах. Существуют правила преобразования десятичных чисел в двоичные и компьютер эти правила понимает.
Однако, числа — это не единственный тип данных, с которым мы работаем. У нас есть строки, изображения, и даже видео. Компьютер знает о том, как представлять в двоичном виде любые типы данных. Возьмём, например, строки. Как компьютер представит строку «L» в двоичном виде? Для того, чтобы сохранить строку в двоичной форме, компьютеру сначала надо преобразовать символы этой строки в числа, а затем надо конвертировать эти числа в их двоичное представление. Так, в случае с нашей строкой из одного символа, компьютеру сначала нужно преобразовать «L» в число, которое представляет этот символ. Посмотрим, как это делается в JavaScript.
Откройте консоль инструментов разработчика браузера и вставьте туда этот код:
Наборы символов
Наборы символов — это заранее заданные правила, касающиеся соответствия символов их числовым кодам. Существует множество разновидностей таких правил. Например, весьма популярные — это Unicode и ASCII. JavaScript очень хорошо умеет работать с наборами символов Unicode. На самом деле, именно таблица символов Unicode используется в браузере для преобразования символа L в число 76, именно в ней записано соответствующее правило.
Итак, мы видели, как компьютер представляет символы в виде чисел. Теперь поговорим о том, как число 76 превращается в своё двоичное представление. Может показаться, что для этого достаточно преобразовать 76 из десятичной в двоичную систему счисления, но не всё так просто.
Кодировка символов
Так же, как существуют правила, указывающие на соответствие символов их числовым кодам, есть и правила преобразования чисел в их двоичное представление. В частности, они касаются того, сколько бит нужно использовать для представления числа. Это называется кодировкой символов.
Один из наборов правил кодировки символов называется UTF-8. UTF-8 определяет правила преобразования символов в байты. Байт — это набор из восьми битов — восьми единиц и нулей. Итак, для представления кодовой точки любого символа должен быть использован набор из восьми единиц и нулей. Разберёмся с этим утверждением.
Как уже было сказано, двоичное представление десятичного числа 12 — это 1100. Итак, когда UTF-8 указывает на то, что число 12 должно быть представлено восьмибитным значением, это означает, что компьютеру нужно добавить несколько битов слева реального двоичного представления числа 12 для того, чтобы представить его в виде одного байта. В результате 12 должно быть сохранено как 00001100. А число 76 будет выглядеть как 01001100.
Именно так компьютер хранит строки или отдельные символы в двоичном виде. По аналогии с этим, у машины есть особые правила по преобразованию в двоичную форму изображений и видео. Смысл всего этого заключается в том, что компьютер хранит в двоичном виде все типы данных и всё это называется двоичными данными.
Если вам интересны тонкости кодировок символов, взгляните на этот материал, в котором всё это подробно раскрывается.
Теперь мы понимаем — что такое двоичные данные, но что такое потоки двоичных данных, которые мы упоминали выше?
Поток
Поток в Node.js представляет собой последовательность данных, перемещаемых из одного места в другое. Перемещение данных происходит не мгновенно, оно занимает некоторое время. Основная идея тут заключается в том, что потоки позволяют обрабатывать большие наборы данных по частям.
А причём тут буфер? Как он помогает работать с двоичными данными, пребывающими в форме потока?
Буфер
Вспомним, что «поток данных» представляет собой перемещение данных из одного места в другое. Зададимся теперь вопросом о том, как именно эти данные перемещаются.
Обычно перемещение данных производят для того, чтобы, как минимум, их прочитать и сделать доступными для возможной последующей обработки. Скажем, для того, чтобы принять на основе данных какое-то решение. Скорость обработки данных компьютером ограничена, поэтому можно говорить о неких рамках, представляющих минимальное и максимальное количество данных, которое какой-то процесс может обработать за некий промежуток времени. Итак, если скорость поступления данных больше, чем скорость, с которой они потребляются, избыточным данным нужно где-то подождать своей очереди на обработку.
С другой стороны, если система способна обрабатывать данные быстрее, чем они поступают, то некоему количеству данных, прибывших раньше, чем может быть начат очередной сеанс обработки некоего пакета данных, нужно подождать прихода ещё некоторого количества данных, прежде чем все они будут отправлены на обработку.
Эта «зона ожидания» и есть буфер! Физическим представлением буфера может являться пространство в оперативной памяти, где данные, при работе с потоком, временно накапливаются, ждут своей очереди, и в итоге отправляются на обработку.
Всё это можно представить себе в виде автовокзала. На некоторых вокзалах автобусам нельзя отправляться до тех пор, пока в них не наберётся некое количество пассажиров, или до тех пор, пока не наступит время отправления. Кроме того, пассажиры могут прибывать на вокзал с различной скоростью. При этом процесс прибытия пассажиров на вокзал никто явно не контролирует.
В любом случае, пассажиры, которые прибыли раньше отправления автобуса, должны подождать, пока администрация вокзала не решит, что их автобусу пора отправляться. А пассажиры, которые прибыли, когда автобус уже полон, или когда он уже отошёл, должны подождать следующего автобуса.
В любом случае речь идёт о некоем «зале ожидания». Буфер в Node.js играет ту же роль. Node.js не может контролировать скорость поступления данных или время их прибытия. Он лишь может принимать решения о том, чтобы отправить на обработку данные, которые уже прибыли. Если время отправки данных на обработку ещё не пришло, Node.js поместит их в буфер — в «зону ожидания».
Типичный пример, в котором вы можете столкнуться с буфером в действии — это просмотр видео в интернете. Если ваше интернет-соединение достаточно быстрое, скорость потока достаточно высока для того, чтобы немедленно заполнить буфер видеопроигрывателя и позволить проигрывателю показать видео, затем заполнить следующий буфер, и отправить его на просмотр — и так до тех пор, пока передача видео не завершится. Тут показан пример системы, в которой данные прибывают быстрее, чем обрабатываются.
Однако, если соединение особой скоростью не отличается, после обработки первого набора прибывших данных, проигрыватель будет показывать значок загрузки данных, или выводить надпись «буферизация», что означает, что он ожидает прибытия большего количества данных перед началом показа видео. А когда буфер оказывается заполненным и данные, поступившие в него, оказываются обработанными, проигрыватель выводит видео. В процессе проигрывания видео будут прибывать новые данные и ждать своей очереди в буфере. Это — как раз тот случай, когда система способна обрабатывать данные быстрее, чем они в неё поступают.
Если проигрыватель завершил воспроизведение данных, поступивших ранее, а буфер пока ещё не заполнен, надпись «буферизация» появится снова, система будет ждать, когда наберётся необходимое ей количество данных. Собственно говоря, в Node работа с буферами выглядит примерно так.
Из исходного определения буфера можно увидеть, что когда данные находятся в буфере, мы можем с ними работать. Что можно сделать с необработанными двоичными данными?
Работа с буферами
Реализация буфера в Node.js даёт нам массу вариантов работы с данными. Кроме того, можно создавать буферы самостоятельно, задавая их характеристики. Итак, помимо того буфера, который Node.js создаст автоматически в процессе передачи данных, можно создать собственный буфер и манипулировать им. Существуют разные способы создания буферов. Взглянем на некоторые из них.
После создания буфера с ним можно начинать работать.
Итоги
Теперь, когда вы понимаете, что такое «буфер», «поток» и «двоичные данные», вы можете открыть документацию по буферам и осмысленно поэкспериментировать со всем тем, о чём там идёт речь.
Кроме того, для того, чтобы увидеть, как с буферами работают на практике, почитайте исходный код библиотеки zlib.js. Это — одна из библиотек ядра Node.js. Посмотрите на то, как в этой библиотеке буферы используются для взаимодействия с потоками двоичных данных. Тут работа ведётся с файлами, представляющими собой gzip-архивы.
Надеемся, то, что вы вынесли из этого материала, то, что нашли в документации, и узнали, анализируя код, поможет поднятию вашего профессионального уровня и пригодится вам в ваших проектах.
Работа с двоичными данными в 1С 8.3 и 8.2
Важное замечание в начале. Основной режим работы 1С в этой статье предполагается 1С 8.3.7 в режиме тонкого клиента без модальных вызовов — самый современный на настоящий момент, на который вскоре должны быть переведены все конфигурации. Также постараюсь описать особенности работы в Веб-Клиенте.
Что такое двоичные данные и как с ними можно работать в 1С 8
Двоичные данные (или бинарные) — это файл данных произвольного формата.
Платформа 1С (8.3 и 8.2) в общем случае понятия не имеет, что это. Предполагается, что программист или пользователь знает, какие именно это данные и как их применять. Тем не менее, если в двоичные данные загружен графический файл, формат которого понимает объект типа «Картинка», то при инициализации картинки такими двоичными данными картинка будет нормально показана, а её свойство «Формат» примет правильное значение.
Платформа 1С при работе с двоичными данными может:
Возможно, я еще что-то упустил, однако интуитивно ясно, что практически все, что надо для работы с двоичными данными в 1С, у нас есть. Рассмотрим теперь по порядку несколько конкретных примеров работы с двоичными данными на платформе 1С 8.3.
Чтение и запись двоичных данных в файл
Основной тип объектов двоичных данных платформы 1С так и называется: «ДвоичныеДанные». Вот что говорит о нем «Синтаксис-помощник»:
Значение содержит двоичные данные, которые считываются из файла. Значение может быть сохранено в ХранилищеЗначения. Хранимые данные могут быть записаны в файл.
Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Сериализуется. Данный объект может быть сериализован в/из XML. Может использоваться в реквизитах управляемой формы.
Чтение двоичных данных из файла
Тип «Двоичные данные» имеет единственный конструктор:
имяФайла — обязательный аргумент.
В итоге получаем программный объект двоичных данных, прочитанный из файла.
Запись двоичных данных в файл
Определение размера двоичных данных в байтах
Сохранение двоичных данных в реквизит объекта
Рассмотрим сразу запись двоичных данных из файла на клиенте в реквизит объекта базы данных типа ХранилищеЗначения. Причем напишем такой код, который сработает и на веб-клиенте, а также будет лишен модальных вызовов, то есть таких вызовов, которые ожидают действия пользователя и останавливают при этом исполнение программы. Теперь платформа 1С 8.3 требует разрабатывать асинхронные программы.
Выглядит это примерно так: создается обработчик оповещения о выполнении некоторой длительной процедуры, затем запускается процедура «НачатьХХХ()», в которую, кроме понятных аргументов, передается еще и описание обработчика ее завершения. Наша программа спокойно работает далее, а по завершении запущенной процедуры вызывается наш обработчик завершения.
Предположим, у нас на форме есть реквизит типа «СправочникСсылка.Картинки». Справочник «Картинки» имеет реквизит «ДанныеКартинки» типа ХранилищеЗначения.
Создадим команду формы «ЗагрузитьКартинкуИзФайла».
Создадим обработчик команды, выделив команду в списке команд формы и нажав на кнопку с увеличительным стеклом в поле «Действие» панели свойств:
Поскольку все необходимые параметры для записи картинки мы можем передать изнутри клиентской части обработчика, нам нет нужды создавать контекстную серверную процедуру на сервере. Выберем «Создать на клиенте и процедуру на сервере без контекста»:
Вначале напишем наши обработчики команды в старом, «модальном» или «синхронном» стиле:
В моей небольшой тестовой конфигурации этот код отлично сработал в режиме тонкого клиента. Теперь преобразуем модальный вызов «ПоместитьФайл» в асинхронный, он же немодальный. В меню конфигуратора запустим команду меню «Текст >Рефакторинг >Нерекомендуемые синхронные вызовы >Преобразовать вызовы модуля». Нам в ответ сообщат, что «Не рекомендуемых синхронных вызовов преобразовано: 1».
Для компактности я удалил все пустые строки, и вот что получилось вместо клиентской части нашего обработчика:
Готово! Мы кошерно асинхронно записали картинку из файла на клиенте в реквизит объекта базы данных, в нашем случае — элемента справочника.
Чтение двоичных данных из объекта БД
Для чего нам надо читать двоичные данные из объекта БД? Наверное, три самых частых случая таковы:
Пример 1. Вставить картинки в макет (табличный документ).
Допустим, у нас есть база данных со справочником «Картинки», у элементов которых есть реквизит «Картинка» типа ХранилищеЗначения, содержащий данные картинки.
Создадим новую внешнюю обработку, ее основную форму.
На форме создадим 3 реквизита «СпрКартинка1», «СпрКартинка2», «СпрКартинка3» типа «СправочникСсылка.Картинки» и реквизит «ТабДок» типа «ТабличныйДокумент». Перетащим мышкой эти реквизиты в список элементов формы, чтобы на ней образовались соответствующие поля.
Добавим команду формы «НапихатьКартинок» и создадим ее обработчик. На сей раз выберем «Создать на Клиенте и процедуру на сервере», чтобы не передавать много параметров в процедуру без контекста. Напишем такие обработчики:
И получим примерно такой результат:
Пример 2. Показать картинку из базы данных на форме.
Для демонстрации воспользуемся первой обработкой, где мы записывали файл в БД. Теперь покажем на форме картинку, которая записана в реквизите «Картинка» выбранного на форме элемента справочника «Картинки».
Во-первых, добавим на форму поле, связанное с реквизитом «АдресДанныхКартинки». Например, перетащим мышкой этот реквизит в список элементов формы. Выберем и установим значение свойства «Вид» этого поля в «Поле картинки».
Во-вторых, напишем такую серверную процедуру:
И станем вызывать эту процедуру, например, из обработчика события «При изменении» поля «Картинка»:
Сохранение двоичных данных в файл на клиенте
Думаю, с сохранением двоичных данных из базы данных в файл у Вас проблем не возникнет. По крайней мере, если Вы работаете не в веб-клиенте. Читаем, помещаем во временное хранилище на сервере, затем записываем в файл на клиенте.
Кодирование двоичных данных в формат Base64 и обратно
Тут все очень просто. Платформа имеет две глобальные функции, доступные везде:
Первая получает в качестве аргумента объект типа «ДвоичныеДанные», а возвращает его текстовое представление в кодировке base64, а вторая, наоборот, из текста в формате base64 возвращает объект типа «ДвоичныеДанные».
Не очень, правда, представляю, зачем нам это может понадобиться. Во всех встроенных типах объектов вроде ПочтовоеВложение или объектов для работы с XML необходимые преобразования платформа делает сама. Разве что нам потребуется работать с какими-то нестандартными форматами файлов для обмена с внешними системами…
Итого
На самых простых примерах мы увидели все основные принципы и методы работы с двоичными данными в 1С 8.3. Также коснулись актуальной сейчас темы устранения синхронных вызовов. Остальные возможности работы с двоичными данными Вы без труда реализуете по аналогии с рассмотренными здесь.
Спасибо за внимание. Желаю всем вершин профессионализма и глубин познаний. А главное — чтобы это приносило счастье в жизнь Вашу и окружающих.
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Бинарный формат
Двоичный (бинарный) файл — в широком смысле: последовательность произвольных байтов. Название связано с тем, что байты состоят из бит, то есть двоичных (англ. binary ) цифр.
В узком смысле слова двоичные файлы противопоставляются текстовым файлам. При этом с точки зрения технической реализации на уровне аппаратуры, текстовые файлы являются частным случаем двоичных файлов, и, таким образом, в широком значении слова под определение «двоичный файл» подходит любой файл.
Часто двоичными файлами называют исполняемые файлы и сжатые данные, однако некорректно так ограничивать это понятие.
Содержание
Визуализация
Для наглядного представления двоичного файла он разбивается на куски равного размера, представляемые в виде чисел, записываемых, обычно, в шестнадцатеричной системе, иногда в восьмеричной, двоичной или десятичной. Означенный размер куска может быть равен одному октету, а также двум или четырём (в случае разбиения на куски по несколько октетов применяется порядок байтов, принятый на используемой платформе). Зависимость диапазона представляемых чисел от размера куска показана в таблице:
октетов | кол-во бит | шестнадцатеричное | восьмеричное | десятичное беззнаковое | десятичное знаковое |
---|---|---|---|---|---|
1 | 8 | 00 … FF | 000 … 377 | 0 … 255 | -128 … 127 |
2 | 16 | 0000 … FFFF | 000000 … 177777 | 0 … 65535 | -32768 … 32767 |
4 | 32 | 00000000 … FFFFFFFF | 00000000000 … 37777777777 | 0 … 4294967295 | -2147483648 … 2147483647 |
Инструменты
Для визуализации
Для редактирования
Литература
Полезное
Смотреть что такое «Бинарный формат» в других словарях:
Формат X файла — формат файла для хранения 3D объектов, созданный компанией Microsoft. Этот формат хранит информацию о геометрии 3D объекта (координаты вершин и координаты нормалей), текстурные координаты, описание материалов, пути и названия к текстурам, которые … Википедия
Двоичный формат файлов Microsoft Excel 97—2007 — Microsoft Excel (Windows) Microsoft Excel 2007 Тип Табличный процессор Разработчик ОС Microsoft Windows … Википедия
Двоичный формат файлов Microsoft Excel 97—2000 — Microsoft Excel (Windows) Microsoft Excel 2007 Тип Табличный процессор Разработчик ОС Microsoft Windows … Википедия
Двоичный формат файлов Microsoft Word 97—2000 — Microsoft Word (Windows) Скриншот Microsoft Word 2007 Тип Текстовый процессор Разработчик Майкрософт … Википедия
Двоичный формат файлов Microsoft Word 97—2007 — Microsoft Word (Windows) Скриншот Microsoft Word 2007 Тип Текстовый процессор Разработчик Майкрософт … Википедия
AMF (формат обмена данными) — У этого термина существуют и другие значения, см. AMF. AMF (англ. Action Message Format, формат сообщений о действиях) бинарный формат обмена данными, использующийся в приложениях, написанных на Action Script. Построен на основе… … Википедия
X (DirectX) — Формат X файла формат файла для хранения 3D объектов, созданный компанией Этот формат хранит информацию о геометрии 3D объекта (координаты вершин и координаты нормалей), текстурные координаты, описание материалов, пути и названия к текстурам,… … Википедия
Двоичное кодирование информации
Любая информация внутри компьютера хранится и обрабатывается в виде длинного кода, состоящего всего из двух символов. Этот код называется двоичным или бинарным.
По своей сути он очень похож на всем известный код Морзе, в котором двумя символами (длинный и короткий импульс) шифруются буквы для передачи текстовой информации по проводам или другим способом.
Компьютеры же пошли значительно дальше. В них в форме бинарного кода хранятся не только текстовые данные, но и программы, музыка, изображения и даже видео высокой четкости.
Перед выводом информации на экран, в аудиосистему или распечатыванием, компьютер «переводит» ее в понятный человеку язык. Но внутри компьютера она хранится и обрабатывается исключительно в виде двоичного кода.
Если вы не программист, знать систему использования бинарного кода в совершенстве не обязательно. Для понимания принципов работы компьютера достаточно разобраться с вопросом в общих чертах. В этом вам и поможет предлагаемая статья.
Содержание статьи
Почему в компьютере используется двоичный код
Люди для записи текстовой информации используют буквы. В русском языке их 33. Комбинациями из десяти цифр (от 0 до 9) мы записываем числовые данные. При работе с графической информацией пользуемся палитрой из миллионов цветов. Наши уши различают звуки в диапазоне от 16 до 20000 Гц.
Если добавить к этому обоняние, вкусовые и тактильные ощущения, получится огромнейшее разнообразие информационных импульсов, которые может воспринимать, хранить и обрабатывать наш мозг.
При помощи технических средств невозможно воссоздать аналогичную систему работы с информацией.
Людям проще всего создавать приборы, принимающие одно из двух состояний: лампочка горит или нет, магнитное поле есть или его нет и т.д. И значительно сложнее, например, заставить лампочку в разных ситуациях светиться одним из 10 цветов. Не говоря уже о 10 миллионах цветов, воспринимаемых человеком.
В технике намного удобнее иметь дело с множеством простых элементов, чем с небольшим количеством сложных.
Чтобы иметь возможность хранить и обрабатывать информацию техническими средствами, люди решили переводить ее на максимально простой «язык», состоящий всего из двух «букв» – так называемый двоичный или бинарный код.
Используя разные комбинации большого количества двух символов, в бинарном коде можно зашифровать любую числовую, текстовую, звуковую или графическую информацию.
Компьютер же является ничем иным, как машиной, предназначенной для хранения и обработки информации в таком виде.
Перевод данных в двоичный код называется кодированием.
Противоположный процесс, в результате которого бинарный код превращается в привычную для людей информацию, называется декодированием.
Компьютер осуществляет кодирование «на лету» при получении данных извне: ввод текста пользователем с клавиатуры, запись видео с веб-камеры, запись звука с микрофона и т.д.
Перед выводом информации на экран, в аудиосистему или же ее распечатыванием, происходит обратный процесс (декодирование).
Как осуществляется кодирование различных типов данных, рассмотрим немного ниже. Сначала давайте разберемся, из каких же символов формируется двоичный код внутри компьютера и как он там хранится.
С технической стороны компьютерный двоичный код реализуется наличием или отсутствием определенных свойств (импульсов) у мельчайших запоминающих элементов. Эти импульсы могут быть:
• фотооптическими
Так, поверхность любого оптического диска (CD, DVD или BluRay) состоит из спирали, которую формируют мелкие отрезки. Каждый из них может быть либо темного, либо светлого цвета. Диск быстро вращается в дисководе. На его спиральной дорожке фокусируется лазер, отражение которого попадает на фотоэлемент. Темные участки спирали поглощают свет и не передают его на фотоэлемент, светлые – наоборот, отражая свет, передают импульс фотоэлементу. В результате фотоэлемент получает информацию, зашифрованную в дорожке диска в виде темных и светлых точек.
Например, внутри жесткого диска находится быстро вращающаяся пластина. Вся ее поверхность тоже представляет собой спираль, состоящую из последовательности миллионов мелких участков. Каждый из них является элементом, который может принимать одно из двух состояний: «намагниченное», «ненамагниченное». Эти элементы и формируют двоичный код, в котором кодируется какая-то информация. Считывание состояния элементов осуществляется специальной головкой, которая быстро движется по поверхности пластины;
Например, оперативная память компьютера является микросхемой, состоящей из миллионов маленьких ячеек, созданных из микроскопических транзисторов и конденсаторов. Каждая такая ячейка может либо содержать электрический заряд, либо нет. Комбинации заряженных и разряженных ячеек оперативной памяти и формируют в ней двоичный код.
В аналогичной форме информация хранится и во всех других запоминающих микросхемах (флешки, SSD-носители и др.).
Процессор компьютера обрабатывает двоичный код тоже в виде электрических импульсов.
Иногда можно встретить ошибочное мнение, что бинарный код внутри компьютера записан в виде обычных нулей и единиц. Это следствие непонимания технической стороны вопроса. Привычных для нас нулей и единиц в компьютере нет. «Символами» компьютерного двоичного кода является наличие или отсутствие у мельчайшего запоминающего элемента определенного свойства (см. выше).
Чтобы было нагляднее, в учебных материалах отсутствие у элемента такого свойства лишь условно обозначают нулем, а его наличие – единицей. Но с таким же успехом их можно бы было обозначать точкой и тире или крестиком и ноликом.
Единицы компьютерной информации
В предыдущем пункте уже говорилось о том, что бинарный код внутри компьютера хранится в виде комбинаций большого количества элементов, каждый из которых может иметь одно из двух состояний.
Такой мельчайший элемент, участвующий в формировании бинарного кода, называется битом.
Битом является, например, каждая темная или светлая точка дорожки оптического диска, каждая запоминающая ячейка оперативной памяти компьютера и т.д.
Но каждый отдельный бит сам по себе не имеет практической ценности. Для кодирования информации используются блоки из нескольких битов.
Представим, например, что в каком-то запоминающем устройстве содержится только один бит. В нем можно будет закодировать всего одно из двух состояний чего либо, например, одну из двух цифр или один из двух цветов. Понятное дело, что практическая ценность такого носителя минимальна.
Блок из 2 битов может принимать одно из 4 состояний:
В 3-хбитном блоке можно закодировать уже одно из 8 состояний:
Ну а 8-битный блок может принимать аж 256 разных состояний. Это уже достаточно существенная частичка двоичного кода, позволяющая отобразить один из значительного количества вариантов.
Например, каждому состоянию 8-битного блока можно сопоставить какую-то букву. Вариантов, а их 256, будет достаточно для кодирования всех русских букв, включая строчные и прописные их варианты, а также всех знаков препинания. Заменяя каждую букву соответствующим 8-мибитным блоком, из двоичного кода можно составить текст.
Этот принцип и используется для записи в компьютере текстовой информации (подробнее речь об этом пойдет ниже).
Как видите, 8-битная ячейка имеет вполне реальную практическую ценность. Поэтому ее и решили считать минимальной единицей компьютерной информации. Эта единица получила название байт.
Текстовые файлы состоят из сотен, тысяч или даже десятков тысяч букв. Соответственно, для их хранения в двоичном коде требуются сотни, тысячи или десятки тысяч байтов.
Поэтому на практике гораздо чаще приходится имеет дело не с байтами, а с более крупными единицами:
• килобайтами (1 килобайт = 1024 байт);
• мегабайтами (1 мегабайт = 1024 килобайт);
• гигабайтами (1 гигабайт = 1024 мегабайт);
• терабайтами (1 терабайт = 1024 гигабайт).
Кодирование числовой информации
Для работы с числовой информацией мы пользуемся системой счисления, содержащей десять цифр: 0 1 2 3 4 5 6 7 8 9. Эта система называется десятичной.
Кроме цифр, в десятичной системе большое значение имеют разряды. Подсчитывая количество чего-нибудь и дойдя до самой большой из доступных нам цифр (до 9), мы вводим второй разряд и дальше каждое последующее число формируем из двух цифр. Дойдя до 99, мы вынуждены вводить третий разряд. В пределах трех разрядов мы можем досчитать уже до 999 и т.д.
Таким образом, используя всего десять цифр и вводя дополнительные разряды, мы можем записывать и проводить математические операции с любыми, даже самыми большими числами.
Система счисления, использующая только две цифры, называется двоичной.
При подсчете в двоичной системе добавлять каждый следующий разряд приходится гораздо чаще, чем в десятичной.
Вот таблица первых десяти чисел в каждой из этих систем счисления:
Как видите, в десятичной системе счисления для отображения любой из первых десяти цифр достаточно 1 разряда. В двоичной системе для тех же целей потребуется уже 4 разряда.
Соответственно, для кодирования этой же информации в виде двоичного кода нужен носитель емкостью как минимум 4 бита (0,5 байта).
Компьютер, кодируя числа в двоичный код, основывается на двоичной системе счисления. Но, в зависимости от особенностей чисел, может использовать разные алгоритмы:
• небольшие целые числа без знака
Для сохранения каждого такого числа на запоминающем устройстве, как правило, выделяется 1 байт (8 битов). Запись осуществляется в полной аналогии с двоичной системой счисления.
Целые десятичные числа без знака, сохраненные на носителе в двоичном коде, будут выглядеть примерно так:
• большие целые числа и числа со знаком
Для записи каждого такого числа на запоминающем устройстве, как правило, отводится 2-байтний блок (16 битов).
Старший бит блока (тот, что крайний слева) отводится под запись знака числа и в кодировании самого числа не участвует. Если число со знаком «плюс», этот бит остается пустым, если со знаком «минус» – в него записывается логическая единица. Число же кодируется в оставшихся 15 битах.
Например, алгоритм кодирования числа +2676 будет следующим:
1. Перевести число 2676 из десятичной системы счисления в двоичную. В итоге получится 101001110100;
2. Записать полученное двоичное число в первые 15 бит 16-битного блока (начиная с правого края). Последний, 16-й бит, должен остаться пустым, поскольку кодируемое число имеет знак +.
В итоге +2676 в двоичном коде на запоминающем устройстве будет выглядеть так:
Примечательно, что в двоичном коде присвоение числу отрицательного значения предусматривает не только изменение старшего бита. Осуществляется также инвертирование всех остальных его битов.
1. Перевести число 2676 из десятичной системы счисления в двоичную. Получим все тоже двоичное число 101001110100;
2. Записать полученное двоичное число в первые 15 бит 16-битного блока. Затем инвертировать, то есть, изменить на противоположное, значение каждого из 15 битов;
3. Записать в 16-й бит логическую единицу, поскольку кодируемое число имеет отрицательное значение.
Запись отрицательных чисел в инвертированной форме позволяет заменить все операции вычитания, в которых они участвуют, операциями сложения. Это необходимо для нормальной работы компьютерного процессора.
Максимальным десятичным числом, которое можно закодировать в 15 битах запоминающего устройства, является 32767. Иногда для записи чисел по этому алгоритму выделяются 4-байтные блоки. В таком случае для кодирования каждого числа будет использоваться 31 бит плюс 1 бит для кодирования знака числа. Тогда максимальным десятичным числом, сохраняемым в каждую ячейку, будет 2147483647 (со знаком плюс или минус).
• дробные числа со знаком
Дробные числа на запоминающем устройстве в двоичном коде кодируются в виде так называемых чисел с плавающей запятой (точкой). Алгоритм их кодирования сложнее, чем рассмотренные выше. Тем не менее, попытаемся разобраться.
Для записи каждого числа с плавающей запятой компьютер чаще всего выделяет 4-байтную ячейку (32 бита):
• в старшем бите этой ячейки (тот, что крайний слева) записывается знак числа. Если число отрицательное, в этот бит записывается логическая единица, если оно со знаком «плюс» – бит остается пустым.
• во втором слева бите аналогичным образом записывается знак порядка (что такое порядок поймете позже);
• в следующих за ним 7 битах записывается значение порядка.
• в оставшихся 23 битах записывается так называемая мантисса числа.
Чтобы стало понятно, что такое порядок, мантисса и зачем они нужны, переведем в двоичный код десятичное число 6,25.
Порядок кодирования будет примерно следующим:
1. Перевести десятичное число в двоичное (десятичное 6,25 равно двоичному 110,01);
3. Определить значение и знак порядка.
Значение порядка – это количество символов, на которое была сдвинута запятая для получения мантиссы. В нашем случае оно равно 3 (или 11 в двоичной форме);
Знак порядка – это направление, в котором пришлось двигать запятую: влево – «плюс», вправо – «минус». В нашем примере запятая двигалась влево, поэтому знак порядка – «плюс»;
Обратите внимание, что мантисса в двоичном коде записывается, начиная с первого после запятой знака, а сама запятая упускается.
Числа с плавающей запятой, кодируемые в 32 битах, называю числами одинарной точности.
Когда для записи числа 32-битной ячейки недостаточно, компьютер может использовать ячейку из 64 битов. Число с плавающей запятой, закодированное в такой ячейке, называется числом двойной точности.
Двоичное кодирование текстовой информации
Существует несколько общепринятых стандартов кодирования текста в двоичном коде.
Одним из наиболее «старых» (разработан еще в 1960-х гг.) является стандарт ASCII (от англ. American Standard Code for Information Interchange). Это 7-битный стандарт кодирования. То есть, используя его, компьютер записывает каждую букву или знак в одну 7-битную ячейку запоминающего устройства.
Как известно, ячейка из 7 битов может принимать 128 различных состояний. Соответственно, в стандарте ASCII каждому из этих 128 состояний соответствует какая-то буква, знак препинания или специальный символ.
Дальнейшее развитие компьютерной техники показало, что 7-битный стандарт кодирования является слишком «тесным». В 128 состояниях, принимаемых 7-битной ячейкой, невозможно закодировать буквы всех существующих в мире письменностей.
Восьмибитными кодировками, распространенными в нашей стране, являются KOI8, UTF8, Windows-1251 и некоторые другие.
Разработаны также и универсальные стандарты кодирования текста (Unicode), включающие буквы большинства существующих языков. В них для записи одного символа может использоваться до 16 битов и даже больше.
Существование большого количества кодировок текста является причиной многих проблем. Вы, наверное, уже встречались с ситуацией, когда в некоторых программах на экране вместо букв отображаются непонятные «кракозябры». Это потому, что компьютер иногда «ошибается» и неверно определяет кодировку, в которой этот текст хранится в его памяти.
В перспективе, вероятно, будет принят единый стандарт кодирования текста, полностью учитывающий разнообразие существующих письменностей, на который постепенно перейдут все компьютеры, независимо от локации и используемого программного обеспечения. Но произойдет это, судя по всему, не скоро.
Кодирование изображений в двоичный код
Чтобы сохранить в двоичном коде фотографию, ее сначала виртуально разделяю на множество мелких цветных точек, называемых пикселями (что-то на подобии мозаики).
После разбивки на точки цвет каждого пикселя кодируется в бинарный код и записывается на запоминающем устройстве.
Если говорят, что размер изображения составляет, например, 512 х 512 точек, это значит, что оно представляет собой матрицу, сформированную из 262144 пикселей (количество пикселей по вертикали, умноженное на количество пикселей по горизонтали).
Прибором, «разбивающим» изображения на пиксели, является любая современная фотокамера (в том числе веб-камера, камера телефона) или сканер.
Чем на большее количество пикселей разделено изображение, тем реалистичнее выглядит фотография в декодированном виде (на мониторе или после распечатывания).
Однако качество кодирования фотографий в бинарный код зависит не только от количества пикселей, но также и от их цветового разнообразия.
Алгоритмов записи цвета в двоичном коде существует несколько. Самым распространенным из них является RGB. Эта аббревиатура – первые буквы названий трех основных цветов: красного – англ.Red, зеленого – англ. Green, синего – англ. Blue.
Из школьных уроков рисования, Вам, наверное, известно, что смешивая эти три цвета в разных пропорциях, можно получить любой другой цвет или оттенок.
На этом и построен алгоритм RGB. Каждый пиксель записывается в двоичном коде путем указания количества красного, зеленого и синего цвета, участвующего в его формировании.
Чем больше битов выделяется для кодирования пикселя, тем больше вариантов смешивания этих трех каналов можно использовать и тем значительнее будет цветовая насыщенность изображения.
Цветовое разнообразие пикселей, из которых состоит изображение, называется глубиной цвета.
Если для кодирования каждого пикселя какого-то изображения выделяется 8 битов двоичного кода, цветовое разнообразие составит 256 цветов.
Тем не менее, часто встречается и так называемая 32-битная глубина цвета. Она не предусматривает увеличение количества оттенков. Дополнительные биты, выделяемые для кодирования каждого пикселя, предназначены для регулирования степени его прозрачности или же не используются.
Описанная выше техника формирования изображений из мелких точек является наиболее распространенной и называется растровой. Но кроме растровой графики, в компьютерах используется еще и так называемая векторная графика.
Векторные изображения создаются только при помощи компьютера (фотокамеры этого делать «не умеют») и формируются не из пикселей, а из графических примитивов (линий, многоугольников, окружностей и др.).
Зачем нужна векторная графика? В известной детской песенке поется, что для изображения «человечка» достаточно нарисовать всего две «палки» и «огуречек». А представьте, насколько трудно вручную составить человечка из большого числа точек.
Векторное изображение в двоичном коде записывается как совокупность примитивов с указанием их размеров, цвета заливки, места расположения на холсте и некоторых других свойств.
Например, чтобы записать на запоминающем устройстве векторное изображение круга, компьютеру достаточно в двоичный код закодировать тип объекта (окружность), координаты его центра на холсте, длину радиуса, толщину и цвет линии, цвет заливки.
В растровой системе пришлось бы кодировать цвет каждого пикселя. И если размер изображения большой, для его хранения понадобилось бы значительно больше места на запоминающем устройстве.
Тем не менее, векторный способ кодирования не позволяет записывать в двоичном коде реалистичные фото. Поэтому все фотокамеры работают только по принципу растровой графики. Рядовому пользователю иметь дело с векторной графикой в повседневной жизни приходится не часто.
Кодирование звуковой информации
Любой звук, слышимый человеком, является колебанием воздуха, которое характеризируется двумя основными показателями: частотой и амплитудой.
Если графически изобразить звуковую волну, она будет выглядеть следующим образом:
Схему работы компьютера со звуком в общих чертах можно описать так.
Микрофон превращает колебания воздуха в аналогичные по характеристикам электрические колебания.
Динамики акустической системы или наушников имеют противоположное микрофону действие. Они превращают электрические колебания в колебания воздуха.
Но каким же образом звуковая карта преобразовывает электрические колебания в двоичный код?
Если взглянуть на графическое изображение волны и внимательно проанализировать ее геометрию, можно увидеть, что в каждый конкретный момент времени звук имеет определенную интенсивность (степень отклонения от начального состояния).
Значит если весь отрезок времени, в течение которого длится звук, разделить на очень маленькие временные участки, то звуковую волну можно будет записать как очередность значений интенсивности звука в каждом таком временном участке.
Но частота «дробления» звука должна быть достаточно высокой, иначе значения участков не будут отображать реальную геометрию волны. Вот примеры слишком низкой частоты дробления.
Описанный принцип разделения звуковой волны на мелкие участки и лежит в основе двоичного кодирования звука.
Аудиокарта компьютера разделяет звук на очень мелкие временные участки и кодирует степень интенсивности каждого из них в двоичный код. Такое «дробление» звука на части называется дискретизацией. Чем выше частота дискретизации, тем точнее фиксируется геометрия звуковой волны и тем качественней получается запись.
Так, простая речь (например, диктофонная запись) нормально воспринимается человеком, если частота дискретизации при кодировании была не ниже 8000 Гц (8 КГц). То есть, каждая секунда такой записи в двоичном коде должна состоять как минимум из 8000 частей.
Музыкальные же произведения, хранимые в компьютере, должны иметь еще более высокую частоту дискретизации. При записи стандартных звуковых CD она составляет минимум 44,1 КГц (44100 Гц).
Качество записи сильно зависит также от количества битов, используемых компьютером для кодирования каждого участка звука, полученного в результате дискретизации.
Представим, например, что для кодирования каждого такого участка компьютер использует 8 битов. Как известно, 8-битная ячейка может принимать одно из 256 значений. Но вдруг разнообразие интенсивности участков, полученных при дискретизации какого-то звука, оказалось более широким (например, 512 вариантов). В таком случае, компьютер «округлит» интенсивность участков до ближайших доступных значений чтобы «уложиться» в 256 вариантов и качество записи получится низким.
Количество битов, используемых для кодирования каждого участка звука, полученного при дискретизации, называется глубиной звука.
Глубины звука в 8-битов достаточно для кодирования простой речи. Но музыкальные произведения с такой глубиной будут звучать отвратительно. Поэтому гораздо чаще встречаются звуковые файлы, закодированные с глубиной 16, 24 или даже 32 бита.
Следует учитывать, что далеко не все устройства, предназначенные для воспроизведения «цифрового» звука, могут работать с файлами, закодированными с высокой частотой дискретизации и/или большой глубиной звука. Такие файлы могут проигрываться на одном компьютере, и «не открываться» на другом (если звуковая карта не поддерживает настолько высокий уровень дискретизации или глубины звука).
Особенности бинарного кодирования видео
Видеозапись состоит из двух компонентов: звукового и графического.
Кодирование звуковой дорожки видеофайла в двоичный код осуществляется по тем же алгоритмам, что и кодирование обычных звуковых данных (см. предыдущий пункт).
Принципы кодирования видеоизображения схожи с кодированием растровой графики (рассмотрено выше), хотя и имеют некоторые особенности.
Учитывая эту особенность, алгоритмы кодирования видео, как правило, предусматривают запись лишь первого (базового) кадра. Каждый же последующий кадр формируются путем записи его отличий от предыдущего.