Может кто-нибудь объяснить мне, что поток байтов на самом деле содержит? Содержит ли он байты (шестнадцатеричные данные) или двоичные данные или только английские буквы? Меня также смущает термин «необработанные данные». Если кто-то попросил меня «перевернуть 4-байтовые данные», то что я должен предполагать, что это шестнадцатеричный или двоичный код?
stream-processing
user2720323
источник
источник
Ответы:
Потоки байтов содержат, ну, байты. Разбитый на то, что это на самом деле, это 8 бит, состоящие из 1 и 0. Если бы он представлял число, это было бы любое число от 0 до 255 (что, я могу добавить, не случайно, почему 4 числа в IP-адресе всегда находятся в диапазоне от 0 до 255). Потоки байтов, как правило, представляют собой сложные интерфейсы, предназначенные для скрытия базового базового байтового массива, используемого для хранения кольцевого буфера (вы заполняете буфер и ждете, пока кто-нибудь его очистит, и тогда он просто снова заполняет буфер).
Какого черта это представляет? Ну, это может быть текстовый файл, или изображение, или видео в реальном времени. Что это такое , полностью зависит от контекста того, кто его читает. Шестнадцатеричное представление - это еще один способ сказать то же самое, хотя иногда удобнее управлять байтами с точки зрения их шестнадцатеричного представления, а не чисел, однако это одно и то же.
Когда вы ссылаетесь на необработанные данные, вы обычно ссылаетесь на байтовые данные. Данные приходят без тега, говорящего «Я файл изображения!» Обычно вы имеете дело с необработанными данными только тогда, когда вам действительно все равно, что эти данные представляют в целом. Например, если бы я хотел преобразовать изображение в его черно-белую версию, я мог бы сказать, что нужно прочитать необработанные данные изображения и прочитать каждые 3 байта (что фактически будет представлением красного цвета, представлением зеленого цвета и представлением синего цвета), добавьте его числовое значение и разделите на 3, затем запишите это значение 3 раза. По сути, я бы сделал усреднение красного, зеленого и синего значений пикселя и сделал из него его серый эквивалентный пиксель. Однако, когда вы говорите о выполнении операций с данными на уровне «побайтово», вы не
Или, возможно, вы хотите сохранить файл в базе данных, но он просит вас вставить его «необработанные данные» в тип данных BLOB-объектов. Это просто означает преобразование данных файла в большой байтовый массив, который база данных может понимать и управлять. Вы обнаружите, что когда вы извлекаете это значение из базы данных, это будет просто один большой байтовый массив, который вы изначально предоставили базе данных для начала. Если эти данные были файлом, то вы, программист, должны интерпретировать эти байтовые данные, как если бы вы читали файл по одному байту за раз.
Если бы кто-то попросил вас «перевернуть 4-байтовые данные», я бы предположил, что это относится к интерпретации чисел с прямым порядком байтов по сравнению с порядком байтов с прямым порядком байтов, которая записывает числа, начиная с самого или младшего значащего байта. Неважно, будет ли число представлено в виде байтов с прямым порядком байтов или байтов с прямым порядком байтов, просто то, что все системы, читающие число, интерпретируют его последовательно.
Это не означает, что фактическое представление чисел (или шестнадцатеричное представление в этом отношении) изменилось, просто то, что порядок, в котором эти 4 байта составляют число, должен быть обратным. Допустим, у вас есть 0x01, 0x02, 0x03 и 0x04. Чтобы изменить их, вместо этого у вас будет 0x04, 0x03, 0x02, 0x01. Система предположительно считала бы эти 4 байта в обратном порядке, и, поскольку вы уже перевернули его, значение интерпретируется так же, как и предполагалось в необработанных данных.
Я надеюсь, что это объясняет!
источник
Байт - это просто единица информации - это может быть что угодно. Сам по себе байт ничего не значит, вы должны придать ему какое-то значение.
Итак, чтобы расширить это -
Шестнадцатеричные данные такие же, как двоичные данные. Это просто другой способ отображения данных. Например, 0x41 = 0b01000001 = 'A' = 65 (десятичное число). Английские буквы были бы только подмножеством этого.
Поскольку hex - это просто представление данных, не имеет значения, как вы к этому относитесь. Если у вас есть данные
0x65 0x66 0x67 0x68
, вы можете получить их в обратном порядке0x68 0x67 0x66 0x65
. Если бы вы смотрели на эти данные с точки зрения символов, вы бы изначальноA B C D
, но теперь у вас естьD C B A
.Вернуться к потоку байтов - это просто последовательность данных. Вы должны знать, что представляют данные, чтобы использовать их. Если мы читаем текстовый файл, поток байтов, который вы получите при чтении файла, будет просто символами некоторого вида. В исполняемом файле будет куча непечатаемых символов, поэтому он будет называться двоичным файлом. Ясно, что можно открыть исполняемый файл в текстовом редакторе, но он не делает ничего полезного.
источник
int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24);
Это буквально берет каждый байт, сдвигает его в правильное положение и объединяет с остальными.Поток байтов - это упорядоченная последовательность байтов. Есть первый байт, который не имеет предшественника. Его преемник - второй байт и так далее. В наши дни байт, как считается, состоит из восьми битов. Если мы хотим быть более точными, мы используем термин поток октетов и октет . До сих пор существуют компьютеры с байтами шириной не восемь бит.
Шестнадцатеричный - это способ записи чисел, который служит печатным представлением для двоичных данных. Шестнадцатеричный на самом деле текст. Например, шестнадцатеричное значение
FE
может представлять байт: биты11111110
с десятичным значением255
. ОднакоFE
на самом деле это строка символов, состоящая из символовF
иE
, которая требует двух байтов в наборе символов US-ASCII или ISO-646! Эти два байта - это то , чтоFE
есть , а один байт со значением 254 - это то, чтоFE
представляет , как печатная запись.Если канал связи, или дескриптор файла или некоторые из таких устройств описываются как несущий поток байт, и никакой другой информации не дается, это почти наверняка делает не означает, что байты представлены в виде шестнадцатеричного текста, так что каждый абстрактный байт в потоке требует два физических байта.
А необработанные данные просто означают биты, которые не интерпретируются как имеющие какую-либо структуру, кроме «массива бит» Необработанные данные обычно имеют структуру и представляют что-то, но когда мы рассматриваем их как необработанные данные, мы либо игнорируем интерпретацию на данный момент (например, мы смотрим на необработанное представление типа данных, чтобы проверить его правильность вниз). до детализации на уровне битов) или интерпретация недоступна (у нас есть некоторые данные, но мы не понимаем структуру данных и то, что они представляют).
источник
Байт 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 - ищите их для получения дополнительной информации о том, почему полезно перетасовывать байты в необработанном потоке байтов.)
источник