Мое предыдущее понимание состоит в том, что вся информация хранилась в двоичном виде (0 и 1) на жестких дисках и в 8-битных блоках на современных компьютерных жестких дисках. И этот шестнадцатеричный используется для облегчения отображения информации, поэтому люди не обязаны читать длинные блоки битов.
Ваше предыдущее понимание совершенно верно, и у меня есть ощущение, что вы уже поняли остальную часть этого ответа, но я хочу объяснить несколько идей, которые люди в любом случае часто смешивают. Я постараюсь быть максимально кратким, но это будет сложно.
Байт, Хранение
Данные обычно хранятся на жестком диске (или в памяти) в 8-битных блоках, называемых байтами. Один бит имеет два возможных значения, которые мы условно обозначаем как 0 и 1. Следовательно, один байт имеет 2 8 = 256 возможных значений.
Я на самом деле не знаю, почему 8-битные блоки являются типичной единицей. Я не достаточно знаком с историей компьютерных разработок, чтобы знать это, но я могу, по крайней мере, сказать вам, что мы продолжаем использовать 8-битные байты в распространенных системах, потому что мы как бы заперты в этом на данный момент, и нет причина измениться
Кроме того, поскольку я знаю, что это произойдет, в действительности данные не обязательно хранятся на диске в виде однобайтовых блоков или одного байта за раз. Типичные жесткие диски часто используют более крупные блоки и т.д. Однако, с точки зрения вашего вопроса, все это не имеет значения. Нам важно только то, что нам кажется, что жесткие диски работают с отдельными байтами. Реальная реализация - интересная тема, но она не затрагивает нас здесь: традиционно люди обычно обсуждают хранение в виде отдельных байтов, и мы, вероятно , люди.
Бинарный, шестнадцатеричный
Причина, по которой мы часто используем двоичную нотацию при обсуждении значений связанных с битами вещей, таких как байты, заключается просто в том, что это имеет смысл. Поскольку бит имеет два возможных значения, это естественно переводит в двоичное представление чисел (двоичное значение означает, что каждая цифра имеет два возможных значения, в отличие от десятичной системы, которую мы обычно используем каждый день, где каждая цифра имеет десять возможных значений).
Причина, по которой нам, программистам, также нравится использовать шестнадцатеричное (каждая цифра имеет шестнадцать возможных значений), заключается в том, что это действительно удобно. Так уж получилось, что диапазон, представляемый одной шестнадцатеричной цифрой, точно соответствует диапазону, представленному четырьмя двоичными цифрами. И это хорошо вписывается в наши 8-битные байты: две шестнадцатеричные цифры могут представлять каждое значение байта. Это также управляемая система для нашего мозга, действительно легко связать гекс с бинарным, когда вы привыкнете к нему.
Мы могли бы использовать систему base-256 при написании, но это было бы неудобно, потому что трудно придумать 256 легко набираемых, понятных и запоминающихся символов. Мы могли бы использовать систему base-17, но она не так аккуратно соответствует 8-значным двоичным числам. Таким образом, мы используем шестнадцатеричное, потому что это имеет огромное значение для нас
Текст
Мы часто используем текст, поэтому нам выгодно предлагать стандартные способы представления символов, которые мы используем каждый день, в виде серии байтов. Это отображение символов в байты называется "кодировка символов" или "набор символов". Конечно, нам не хватает фактического согласования вещей, а также было разработано много разных таких сопоставлений независимо для многих разных потребностей, поэтому у нас есть много наборов символов, таких как ASCII, или ISO-8859-1, или JIS.
Кроме того, был изобретен юникод, чтобы попытаться определить стандарт, который сделал всех счастливыми, объединяя все наши различные кодировки символов, отсюда и название "юникод".
Но дело в том, что текст представлен сериями байтов, и то, что означает каждая серия байтов, определяется различными кодировками символов, и тот факт, что байты представляют текст вообще, основывается на предположении, что программа, читающая байты, понимает, что они должны представлять текст. Об ASCII удобно говорить, потому что каждый символ соответствует ровно одному байту, а также он действительно старый, очень простой, действительно широко использовался, и, несмотря на то, что он совершенно не подходит для мирового сообщества, все еще очень популярен и его легко обсуждать.
Семантика
Это, я убежден, самый запутанный момент для многих людей.
Байты - это просто байты. Они имеют по существу произвольные значения. Что на самом деле означают эти значения, определяется только контекстом и тем, что программа, читающая их, на самом деле делает с ними.
Например, если вспомнить, что байт может принимать 256 значений, значение 97 (двоичное 01100001, шестнадцатеричное 61) в конце дня может означать много разных вещей:
- Если байт рассматривается как целочисленное значение, это число 97.
- Если байт рассматривается как символ ASCII, это буква
a
.
- Если байт рассматривается как машинная инструкция для процессоров, совместимых с Intel x86, то это инструкция
POPA
или POPAD
(не имеет значения, если вы не знаете, что это такое, это не главное ).
- Если байт представляет пиксель в изображении в градациях серого, это, вероятно, этот оттенок серого .
- Если байт является частью некоторых картографических данных для какой-либо игры, возможно, это дерево или забор или что-то еще.
- И т.п.
Даже для числовых значений битовые комбинации могут иметь разное значение, например:
- Иногда мы удовлетворены значениями 0-255. В других случаях мы хотим обрабатывать отрицательные числа, поэтому мы смещаем диапазон семантических значений от -128 до 127 и используем первый бит, чтобы указать, отрицателен он или нет. Или что угодно. Небо - это предел (хотя, как и кодировки символов, существует общепринятый стандартный набор правил и для целочисленных значений).
- Иногда из-за различных обстоятельств мы даже кодируем целочисленные значения другими способами, например, BCD.
- Иногда нам нужно представлять большие целые числа. Поэтому мы используем много байтов. Даже у этого есть варианты, см. "Endianness".
- Иногда нам нужно представлять десятичные числа. Здесь также много опций, см. Опцию с плавающей и фиксированной точкой.
Смысл всего этого в том, что байт - это просто байт, он ничего не значит, пока у вас нет контекста. Если программа записывает несколько байтов с некоторым предполагаемым значением, то только программа, которая читает их и интерпретирует их как имеющие такое же значение, сможет правильно понять это.
Соедини это все вместе
Итак, теперь, связывая все это с вашим ответом, это должно быть действительно очень просто сейчас:
- Ваш друг ссылается на идею о том, что вы сохраняете число как текстовое представление его значения в шестнадцатеричном формате. Например, значение 97 в шестнадцатеричном формате может быть 61. Это двухзначное число, содержащее символ "6" и "1". Закодировано как ASCII , которое будет двумя байтами: значение 54, за которым следует значение 49 (десятичное). Но это имеет смысл только тогда, когда, когда вы читаете эти байты назад, вы понимаете, что они представляют собой две шестнадцатеричные цифры в кодировке ASCII.
- Вы также можете просто сохранить значение 97. Это только один байт. Это половина длины предыдущего варианта. Но, конечно, это имеет значение, только если, когда вы читаете этот байт назад, вы понимаете, что оно соответствует целочисленному значению.
Как правило, американские программисты, вероятно, выбрали бы второй вариант, но он действительно зависит от контекста. Например, в HTML-документе, предназначенном для восприятия человеком текста, мы по-прежнему сохраняем такой атрибут, как width="97"
. Конечно, здесь может потребоваться меньше места, чтобы использовать более узкое представление, но тогда было бы больно писать HTML. Так что это действительно зависит от контекста и варианта использования.
Я надеюсь, что по крайней мере что-то из этого имеет смысл.