Что такое поток байтов на самом деле?

34

Может кто-нибудь объяснить мне, что поток байтов на самом деле содержит? Содержит ли он байты (шестнадцатеричные данные) или двоичные данные или только английские буквы? Меня также смущает термин «необработанные данные». Если кто-то попросил меня «перевернуть 4-байтовые данные», то что я должен предполагать, что это шестнадцатеричный или двоичный код?

user2720323
источник
Мои два цента не заслуживают ответа (а ниже уже есть хорошие), но я просто хочу предоставить ссылки на эти 2 статьи, которые, вероятно, дадут хорошее представление о том, как «необработанные данные» интерпретируются как нечто действительно значимое (это не ничего не значат, если вы не знаете, что он должен представлять и как он кодируется / хранится) betterexplained.com/articles/… joelonsoftware.com/articles/Unicode.html
Майкл
1
Я думаю, что Java создал байт, чтобы избежать использования символа c / c ++ для вещей, которые не могут быть поняты как символ. char часто использовался в c / c ++, потому что размер char равен 1 байту. Также устройства в Unix являются блочными и символьными устройствами. Если вы читаете с символьных устройств, вы получите поток неподписанных символов / байтов.
imel96
Поток байтов неоднозначен. Поток октетов нет.
Охотник на оленей
Данные можно интерпретировать на многих уровнях. Внизу это просто серия электрических уровней. Чуть выше это кусок байтов или, как вы говорите, поток байтов . Еще выше вы начинаете интерпретировать необработанные данные. Байты могут быть интерпретированы как текст во многих отношениях (кодировки). Целые числа тоже (с большим или маленьким порядковым номером). Вы даже можете подняться выше. У вас есть почтовый файл. Этот zip-файл является вашей резервной копией со вчерашнего дня. И так далее. Проблема в том, что точный уровень часто неявен и не понятен, и это может сбивать с толку.
nalply

Ответы:

52

Потоки байтов содержат, ну, байты. Разбитый на то, что это на самом деле, это 8 бит, состоящие из 1 и 0. Если бы он представлял число, это было бы любое число от 0 до 255 (что, я могу добавить, не случайно, почему 4 числа в IP-адресе всегда находятся в диапазоне от 0 до 255). Потоки байтов, как правило, представляют собой сложные интерфейсы, предназначенные для скрытия базового базового байтового массива, используемого для хранения кольцевого буфера (вы заполняете буфер и ждете, пока кто-нибудь его очистит, и тогда он просто снова заполняет буфер).

Какого черта это представляет? Ну, это может быть текстовый файл, или изображение, или видео в реальном времени. Что это такое , полностью зависит от контекста того, кто его читает. Шестнадцатеричное представление - это еще один способ сказать то же самое, хотя иногда удобнее управлять байтами с точки зрения их шестнадцатеричного представления, а не чисел, однако это одно и то же.

Когда вы ссылаетесь на необработанные данные, вы обычно ссылаетесь на байтовые данные. Данные приходят без тега, говорящего «Я файл изображения!» Обычно вы имеете дело с необработанными данными только тогда, когда вам действительно все равно, что эти данные представляют в целом. Например, если бы я хотел преобразовать изображение в его черно-белую версию, я мог бы сказать, что нужно прочитать необработанные данные изображения и прочитать каждые 3 байта (что фактически будет представлением красного цвета, представлением зеленого цвета и представлением синего цвета), добавьте его числовое значение и разделите на 3, затем запишите это значение 3 раза. По сути, я бы сделал усреднение красного, зеленого и синего значений пикселя и сделал из него его серый эквивалентный пиксель. Однако, когда вы говорите о выполнении операций с данными на уровне «побайтово», вы не

Или, возможно, вы хотите сохранить файл в базе данных, но он просит вас вставить его «необработанные данные» в тип данных BLOB-объектов. Это просто означает преобразование данных файла в большой байтовый массив, который база данных может понимать и управлять. Вы обнаружите, что когда вы извлекаете это значение из базы данных, это будет просто один большой байтовый массив, который вы изначально предоставили базе данных для начала. Если эти данные были файлом, то вы, программист, должны интерпретировать эти байтовые данные, как если бы вы читали файл по одному байту за раз.

Если бы кто-то попросил вас «перевернуть 4-байтовые данные», я бы предположил, что это относится к интерпретации чисел с прямым порядком байтов по сравнению с порядком байтов с прямым порядком байтов, которая записывает числа, начиная с самого или младшего значащего байта. Неважно, будет ли число представлено в виде байтов с прямым порядком байтов или байтов с прямым порядком байтов, просто то, что все системы, читающие число, интерпретируют его последовательно.

Это не означает, что фактическое представление чисел (или шестнадцатеричное представление в этом отношении) изменилось, просто то, что порядок, в котором эти 4 байта составляют число, должен быть обратным. Допустим, у вас есть 0x01, 0x02, 0x03 и 0x04. Чтобы изменить их, вместо этого у вас будет 0x04, 0x03, 0x02, 0x01. Система предположительно считала бы эти 4 байта в обратном порядке, и, поскольку вы уже перевернули его, значение интерпретируется так же, как и предполагалось в необработанных данных.

Я надеюсь, что это объясняет!

Нил
источник
Все хорошо ..! Можете ли вы разработать ответ, касающийся «необработанных данных»?
user2720323
@ user2720323 Хорошо, модифицировано, чтобы лучше объяснить «необработанные данные». :)
Нил
Следует помнить одну вещь: все данные - это просто набор байтов. Значение этих байтов определяется какими-то метаданными (расширение файла, поле базы данных и т. Д.). Файл изображения можно интерпретировать как файл ASCII и наоборот. Текст или изображение могут быть бессмысленными, но это все же возможно. (Сумасшедший ... Я должен был прочитать следующие ответы)
Дейв Най
2
@kevincline Пожалуйста, постарайтесь оценить тот факт, что я пытаюсь донести идею. Мой приоритет не состоит в том, чтобы написать точный алгоритм. Если вы хотите быть более точным, вы бы взвесили значения красного, зеленого и синего в соответствии с тем, что может воспринимать человеческий глаз.
Нил
18

Байт - это просто единица информации - это может быть что угодно. Сам по себе байт ничего не значит, вы должны придать ему какое-то значение.

Итак, чтобы расширить это -

Содержит ли он байты (шестнадцатеричные данные) или двоичные данные или только английские буквы?

Шестнадцатеричные данные такие же, как двоичные данные. Это просто другой способ отображения данных. Например, 0x41 = 0b01000001 = 'A' = 65 (десятичное число). Английские буквы были бы только подмножеством этого.

Если кто-то попросил меня «перевернуть 4-байтовые данные», то что я должен предполагать, что это шестнадцатеричный или двоичный код?

Поскольку hex - это просто представление данных, не имеет значения, как вы к этому относитесь. Если у вас есть данные 0x65 0x66 0x67 0x68, вы можете получить их в обратном порядке 0x68 0x67 0x66 0x65. Если бы вы смотрели на эти данные с точки зрения символов, вы бы изначально A B C D, но теперь у вас есть D C B A.

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

rm5248
источник
1
+1, но акцент на двоичном в бите lat кажется неуместным. «двоичные данные» часто содержат непечатаемые символы, но они называются «двоичными», потому что они состоят из двоичных цифр, а не потому, что содержат непечатаемые символы. Я понимаю, что вы используете «двоичный» в противоположность печатным «текстовым» данным, но я думаю, что это может еще больше запутать ОП.
Калеб
У меня есть один вопрос, касающийся обращения .. Если у меня есть целое число (32 бита) 325487 в файле, как я могу обратить это 4-байтовое целое число? аналогично у меня есть слово («привет, как дела»), как перевернуть эту строку, приняв каждый символ в качестве байта.
user2720323
@ user2720323 int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24); Это буквально берет каждый байт, сдвигает его в правильное положение и объединяет с остальными.
Нил
2

Поток байтов - это упорядоченная последовательность байтов. Есть первый байт, который не имеет предшественника. Его преемник - второй байт и так далее. В наши дни байт, как считается, состоит из восьми битов. Если мы хотим быть более точными, мы используем термин поток октетов и октет . До сих пор существуют компьютеры с байтами шириной не восемь бит.

Шестнадцатеричный - это способ записи чисел, который служит печатным представлением для двоичных данных. Шестнадцатеричный на самом деле текст. Например, шестнадцатеричное значение FEможет представлять байт: биты 11111110с десятичным значением 255. Однако FEна самом деле это строка символов, состоящая из символов Fи E, которая требует двух байтов в наборе символов US-ASCII или ISO-646! Эти два байта - это то , что FE есть , а один байт со значением 254 - это то, что FE представляет , как печатная запись.

Если канал связи, или дескриптор файла или некоторые из таких устройств описываются как несущий поток байт, и никакой другой информации не дается, это почти наверняка делает не означает, что байты представлены в виде шестнадцатеричного текста, так что каждый абстрактный байт в потоке требует два физических байта.

А необработанные данные просто означают биты, которые не интерпретируются как имеющие какую-либо структуру, кроме «массива бит» Необработанные данные обычно имеют структуру и представляют что-то, но когда мы рассматриваем их как необработанные данные, мы либо игнорируем интерпретацию на данный момент (например, мы смотрим на необработанное представление типа данных, чтобы проверить его правильность вниз). до детализации на уровне битов) или интерпретация недоступна (у нас есть некоторые данные, но мы не понимаем структуру данных и то, что они представляют).

Kaz
источник
У PDP-10 были инструкции для работы с байтами переменного размера. Наиболее распространенным был семибитный ASCII, за которым следовали шестибитные символы.
Кевин Клайн
0

Байт 8 бит. Бит равен 0 или 1. «Сырые данные» - это просто поток одного байта за другим. Поток байтов может поступать из файла, сетевого соединения, сериализованного объекта, генератора случайных чисел и т. Д.

  • Существует несколько способов отображения байта: двоичный (01110110), шестнадцатеричный = шестнадцатеричный (7C), восьмеричный (0271) или десятичный (215). Во всех случаях максимальное значение составляет 255 (основание 10).

  • Иногда байты назначаются символам, например, ascii. Введите «ascii» в командной строке Unix, и вы получите большую таблицу, которая отображает байтовые значения 0-255 или (гекс 0-FF) на соответствующий символ. Например, пробел равен х20, а «А» - х40. Обратите внимание, что некоторые значения байтов отображаются на управляющие символы и не могут быть напечатаны. Но сами байты не являются символами - они просто набор битов. Число.

  • «обратные 4 байта» - это взять несколько байтов 123 42 231 0 и изменить порядок - 0 231 42 123. Применительно к байтному потоку я, вероятно, прочитал бы 4 байта, перевернул их, прочитал следующие 4 байта и т. д. ,

(Кстати, эта проблема актуальна, потому что, если вы хотите представить число больше 255 в качестве байтов, вам нужно использовать более одного байта. Но тогда возникает вопрос, идет ли «самый большой» байт первым или последним? big endian или little endian - ищите их для получения дополнительной информации о том, почему полезно перетасовывать байты в необработанном потоке байтов.)

обкрадывать
источник