Що насправді є потоком байтів?


34

Хто-небудь може мені пояснити, що насправді містить потік байтів? Чи містить він байти (шістнадцяткові дані) або двійкові дані або лише англійські літери? Мене також бентежить термін "необроблені дані". Якщо хтось попросив мене "повернути 4-байтні дані", то що я можу припустити, що це шістнадцятковий чи двійковий код?


Мої два центи не відповідають гідно (а нижче вже є хороші), але я просто хочу надати посилання на ці 2 статті, які, ймовірно, дадуть гарне розуміння того, як "необроблені дані" трактуються, щоб насправді щось означало (це не означає майте на увазі що завгодно, якщо ви не знаєте, що воно повинно представляти і як воно кодується / зберігається) betterexplained.com/articles/… joelonsoftware.com/articles/Unicode.html
Майкл

1
Я думаю, що Java створила байт, щоб уникнути використання символу c / c ++ для речей, які не можна зрозуміти як характер. char багато використовували в c / c ++, оскільки розмір char - 1 байт. Також пристроями в unix є пристрої блоку та символів. Якщо ви читаєте з пристроїв char, ви отримуєте потік неподписаних символів / байтів.
име96

Потік байтів неоднозначний. Потік Октет - ні.
Мисливець на оленів

Дані можна інтерпретувати на багатьох рівнях. У нижній частині це лише серія електричних рівнів. Трохи вище вгору це шматок байтів, або, як ви кажете, потік байтів . Ще вище ви починаєте інтерпретувати необроблені дані. Байти можна інтерпретувати як текст багатьма способами (кодування). Цілі числа також (великі або маленькі ендіани). Можна навіть піднятися вище. У вас є поштовий файл. Цей zip-файл - це ваша резервна копія з вчорашнього дня. І так далі. Проблема полягає в тому, що точний рівень часто неявний і не прояснюється, і це може заплутати.
nalply

Відповіді:


52

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

Що чорт це представляє? Ну, це може представляти текстовий файл, або зображення, або прямий відеопотік. Те , що він є повністю залежить від контексту , який читає його. Шістнадцяткове представлення - це ще один спосіб сказати те саме, хоча іноді зручніше керувати байтами з точки зору їх шестигранного представлення, а не чисел, однак це одне і те ж.

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

Або, можливо, ви хочете зберегти файл у базі даних, але він просить вставити його "необроблені дані" у тип даних blob. Це просто означає перетворити дані файлу у великий байтовий масив, який база даних може зрозуміти та керувати. Ви побачите, що коли ви отримаєте це значення з бази даних, це буде просто один великий байтовий масив, як ви спочатку надавали базі даних. Якщо ці дані були файлом, то ви, програміст, повинні повторно інтерпретувати ці дані, як ніби ви читали файл один байт.

Якби хтось попросив вас "повернути 4-байтні дані", я вважаю, що це стосується інтерпретації чисел з великим ендіаном проти малого-ендіану, яка записує числа, починаючи з найбільшого або найменш значущого байта. Не має значення, чи число представлене як велике-ендіанське або мало-ендіанське, лише те, що всі системи, що читають число, інтерпретують це послідовно.

Це не означає, що фактичне представлення чисел (або шістнадцяткове подання для цього питання) змінюється, просто щоб порядок, у якому ці 4 байти роблять число, повинен бути змінений. Тож скажіть, що у вас є 0x01, 0x02, 0x03 та 0x04. Щоб змінити їх назад, натомість у вас буде 0x04, 0x03, 0x02, 0x01. Система, ймовірно, читала б ці 4 байти у зворотному порядку, і оскільки ви вже повернули її, значення інтерпретується таким самим, як і призначене у вихідних даних.

Я сподіваюся, що це пояснює!


Все добре ..! Чи можете ви, будь ласка, розробити відповідь, враховуючи "необроблені дані"?
користувач2720323

@ 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.

Повернення до потоку байтів - це лише послідовність даних. Вам потрібно знати, що представляють дані, щоб їх використовувати. Якщо ми читаємо текстовий файл, то байтовий потік, який ви отримаєте при читанні файлу, буде просто певним символом. Виконавчий файл мав би в ньому купу недрукуваних символів, тому його називали б бінарним файлом. Зрозуміло, що можна відкрити виконуваний файл в текстовому редакторі, але це не робить нічого корисного.


1
+1, але наголос на двійковій у лат-біті здається неправильним. "двійкові дані" часто містять недруковані символи, але це називається "двійкові", тому що вони складаються з двійкових цифр, а не тому, що вони містять недруковані символи. Я розумію, що ви використовуєте "двійкові" на противагу друкованим "текстовим" даним, але я думаю, що це може заплутати ОП ще більше.
Калеб

У мене виникає одне запитання щодо обернення .. Якщо у мене є ціле число (32 біт) 325487 у файлі, як я можу повернути це ціле ціле байт 4? аналогічно у мене є слово ("хай, як справи"), як повернути цей рядок, прийнявши кожен символ як байт.
користувач2720323

@ 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 представляє , як друковані позначення.

Якщо канал зв’язку або ручка файлу або якийсь такий пристрій описується як несучий байтовий потік, і інша інформація не надається, це майже напевно не означає, що байти представляються як шістнадцятковий текст, так що кожен абстрактний байт у потоці вимагає два фізичні байти.

А необроблені дані просто означають біти, які не інтерпретуються як такі, що не мають будь-якої структури, крім простого "масиву бітів". Сирі дані зазвичай мають структуру і щось представляють, але коли ми розглядаємо це як необроблені дані, ми на даний момент або ігноруємо інтерпретацію (наприклад, ми дивимось на необроблене представлення типу даних, щоб перевірити його правильність. до детального рівня біт) або інтерпретація недоступна (у нас є деякі дані, але ми не розуміємо структуру даних і що вони представляють).


PDP-10 мав інструкції по роботі з байтами змінної величини. Найпоширенішим був семибітний ASCII, за ним - шестибітні символи.
кевін клайн

0

Байт - 8 біт. Трохи дорівнює 0 або 1. "Неопрацьовані дані" - це лише потік одного байта за іншим. Потік байтів може надходити з файлу, мережевого з'єднання, серіалізованого об'єкта, генератора випадкових чисел тощо.

  • Існує кілька способів відображення байта: двійковий (01110110), шестнадцятковий (дванадцятимісний) (7С), восьмеричний (0271) або десятковий (215). У всіх випадках максимальне значення - 255 (основа 10).

  • Іноді байти присвоюються символам, наприклад, ascii. Введіть "ascii" в командному рядку unix, і ви отримаєте велику таблицю, яка відображає значення байтів 0-255 або (шестигранник 0-FF) на пов'язаний символ. Наприклад, простір - x20, а "A" - x40. Зауважте, що деякі байтові значення відображаються для керування символами та не підлягають друку. Але самі байти не є символами - вони просто пакет біт. Число.

  • "Зворотний 4 байти" має взяти кілька байт 123 42 231 0 і перевернути порядок - 0 231 42 123. Застосовуючи до пари байтів, я, мабуть, прочитав 4 байти, перевернув їх, прочитав наступні 4 байти тощо .

(BTW ця проблема є актуальною, тому що якщо ви хочете представити число, яке перевищує 255 як байди, вам потрібно використовувати більше одного байта. Але тоді питання полягає в тому, чи приходить "найбільший" байт першим чи останнім? Це називається великий ендіан або маленький ендіан - шукайте докладніші відомості про те, чому корисно переміщати навколо байтів у потоці поточного байту.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.