Co to jest strumień bajtów?

34

Czy ktoś może mi wyjaśnić, co faktycznie zawiera strumień bajtów? Czy zawiera tylko bajty (dane szesnastkowe), dane binarne lub tylko angielskie litery? Jestem również zdezorientowany terminem „surowe dane”. Jeśli ktoś poprosił mnie o „odwrócenie danych 4-bajtowych”, to co powinienem założyć, że jest to kod szesnastkowy lub kod binarny?

użytkownik2720323
źródło
Moje dwa centy nie są warte odpowiedzi (a poniżej są już dobre), ale chcę tylko podać linki do tych 2 artykułów, które zapewnią dobry wgląd w to, jak interpretowane są „surowe dane” w rzeczywistości coś (to nie znaczy znaczy cokolwiek, chyba że wiesz, co to ma reprezentować i jak jest kodowane / przechowywane) betterexplained.com/articles/… joelonsoftware.com/articles/Unicode.html
Michael
1
Myślę, że java utworzył bajt, aby uniknąć używania znaku c / c ++ do rzeczy, które nie mogą być rozumiane jako znak. char był często używany w c / c ++, ponieważ rozmiar char wynosi 1 bajt. Również urządzenia w Uniksie są urządzeniami blokowymi i znakowymi. Jeśli czytasz z urządzeń char, otrzymujesz strumień niepodpisanych znaków / bajtów.
imel96
Strumień bajtów jest niejednoznaczny. Strumień oktetów nie jest.
Deer Hunter
Dane można interpretować na wielu poziomach. Na dole jest to tylko seria poziomów elektrycznych on-off. Nieco wyżej jest to kawałek bajtów lub, jak mówisz, strumień bajtów . Jeszcze wyżej zaczynasz interpretować surowe dane. Bajty mogą być interpretowane jako tekst na wiele sposobów (kodowania). Liczby całkowite też (duży lub mały endian). Możesz nawet iść wyżej. Masz plik zip. Ten plik zip jest twoją kopią zapasową z wczoraj. I tak dalej. Problem polega na tym, że dokładny poziom jest często niejawny i nieprecyzyjny, co może być mylące.
dokładnie

Odpowiedzi:

52

Strumienie bajtów zawierają bajty. W podziale na to, co jest w rzeczywistości, jest to 8 bitów złożonych z 1 i 0. Gdyby reprezentował liczbę, byłaby to dowolna liczba od 0 do 255 (co mogę dodać, to nie przypadek, że 4 liczby w adresie IP zawsze mają zakres od 0 do 255). Strumienie bajtów są zwykle wyrafinowanymi interfejsami mającymi na celu ukrycie podstawowej tablicy bajtów służącej do przechowywania bufora kołowego (wypełniasz bufor i czekasz, aż ktoś go opróżni, po czym ponownie wypełnia bufor).

Co do cholery to reprezentuje? Może reprezentować plik tekstowy, obraz lub strumień wideo na żywo. To, co to jest, zależy całkowicie od kontekstu tego, kto to czyta. Reprezentacja heksadecymalna to kolejny sposób na powiedzenie tego samego, chociaż czasem wygodniej jest zarządzać bajtami pod względem ich reprezentacji szesnastkowej niż liczb, jednak jest to to samo.

Gdy odwołujesz się do danych surowych, zwykle masz na myśli dane bajtowe. Dane przychodzą bez znacznika „Jestem plikiem obrazu!” Zwykle masz do czynienia z surowymi danymi tylko wtedy, gdy tak naprawdę nie obchodzi Cię, co dane reprezentują ogólnie. Na przykład, jeśli chciałbym przekonwertować obraz na jego czarno-białą wersję, mógłbym powiedzieć, że czytam surowe dane obrazu i na każde 3 odczytane bajty (co w rzeczywistości byłoby reprezentacją koloru czerwonego, reprezentacją koloru zielonego i reprezentacją niebieski kolor), dodaj jego wartość liczbową i podziel przez 3, a następnie wpisz tę wartość 3 razy. Zasadniczo to, co bym zrobił, to uśrednienie wartości czerwonego, zielonego i niebieskiego piksela i utworzenie z niego piksela równoważnego szarości. Jednak mówiąc o wykonywaniu operacji na danych na poziomie „bajt po bajcie”, nie „

Lub być może chcesz zapisać plik w bazie danych, ale prosi on o wstawienie jego „surowych danych” do typu danych obiektów blob. Oznacza to po prostu konwersję danych pliku na tablicę dużych bajtów, którą baza danych może zrozumieć i zarządzać. Przekonasz się, że gdy pobierzesz tę wartość z bazy danych, będzie to po prostu jedna wielka tablica bajtów, tak jak początkowo dostarczyłeś bazę danych na początek. Jeśli te dane były plikiem, to ty, programista, musisz ponownie zinterpretować te bajty, tak jakbyś czytał plik po jednym bajcie.

Gdyby ktoś poprosił cię o „odwrócenie danych 4-bajtowych”, założyłbym, że odnosi się to do interpretacji liczb big-endian vs. little-endian, która zapisuje liczby zaczynające się od najbardziej lub najmniej znaczącego bajtu. Nie ma znaczenia, czy liczba jest reprezentowana jako big-endian czy little-endian, tyle że wszystkie systemy odczytujące liczbę konsekwentnie ją interpretują.

Nie oznacza to, że rzeczywista reprezentacja liczb (lub reprezentacja szesnastkowa w tym przypadku) została zmieniona, po prostu kolejność, w jakiej te 4 bajty tworzą liczbę, powinna zostać odwrócona. Powiedzmy, że masz 0x01, 0x02, 0x03 i 0x04. Aby je odwrócić, miałbyś zamiast tego 0x04, 0x03, 0x02, 0x01. System prawdopodobnie odczytałby te 4 bajty w odwrotnej kolejności, a ponieważ już to odwróciłeś, wartość jest interpretowana jako taka sama, jak zamierzona w surowych danych.

Mam nadzieję, że to wyjaśnia!

Neil
źródło
Wszystko w porządku ..! Czy możesz podać odpowiedź dotyczącą „surowych danych”?
user2720323,
@ user2720323 OK, zmodyfikowano w celu lepszego wyjaśnienia „surowych danych”. :)
Neil
Należy pamiętać o jednym ... wszystkie dane to po prostu zbiór bajtów. Znaczenie tych bajtów jest określone przez pewnego rodzaju metadane (rozszerzenie pliku, pole bazy danych itp.). Plik obrazu może być interpretowany jako plik ASCII i odwrotnie. Tekst lub obraz może być bez znaczenia, ale nadal jest to możliwe. (Derp ... Powinienem był przeczytać kolejne odpowiedzi)
Dave Nay
2
@kevincline Proszę docenić fakt, że próbuję przekazać pomysł. Moim priorytetem nie jest napisanie dokładnego algorytmu. Jeśli chcesz być bardziej dokładny, zważ czerwone, zielone i niebieskie wartości zgodnie z tym, co może dostrzec ludzkie oko.
Neil,
18

Bajt to po prostu jednostka informacji - może to być wszystko. Sam bajt nic nie znaczy, musisz nadać mu jakiś sens.

Aby rozwinąć tę kwestię -

Czy zawiera tylko bajty (dane szesnastkowe), dane binarne lub tylko angielskie litery?

Dane szesnastkowe są takie same jak dane binarne. To po prostu inny sposób wyświetlania danych. Na przykład 0x41 = 0b01000001 = „A” = 65 (dziesiętnie). Angielskie litery byłyby tylko częścią tego.

Jeśli ktoś poprosił mnie o „odwrócenie danych 4-bajtowych”, to co powinienem założyć, że jest to kod szesnastkowy lub kod binarny?

Ponieważ hex jest tylko reprezentacją danych, nie ma znaczenia, jak o tym myślisz. Jeśli masz dane 0x65 0x66 0x67 0x68, możesz je odwrócić 0x68 0x67 0x66 0x65. Gdybyś patrzył na te dane w kategoriach znaków, pierwotnie byś to zrobił A B C D, ale teraz maszD C B A .

Powrót do strumienia bajtów - to tylko sekwencja danych. Musisz wiedzieć, co reprezentują dane, aby z nich korzystać. Jeśli czytamy plik tekstowy, strumień bajtów, który otrzymujesz podczas czytania pliku, to po prostu jakieś znaki. Plik wykonywalny zawierałby wiele znaków, które nie mogą zostać wydrukowane, dlatego nazwano by go plikiem binarnym . Oczywiście możliwe jest otwarcie pliku wykonywalnego w edytorze tekstu, ale nie robi nic pożytecznego.

rm5248
źródło
1
+1, ale nacisk na binarny w bitach wydaje się być niewłaściwy. „dane binarne” często zawierają znaki niedrukowalne, ale nazywane są „binarnymi”, ponieważ składają się z cyfr binarnych, a nie dlatego, że zawierają znaki niedrukowalne. Rozumiem, że używasz „binarnego” w przeciwieństwie do danych „tekstowych” do wydrukowania, ale myślę, że może to jeszcze bardziej pomieszać OP.
Caleb,
Mam jedno pytanie dotyczące zamiany. Jeśli w pliku mam liczbę całkowitą (32-bitową) 325487, jak mogę odwrócić tę 4-bajtową liczbę całkowitą? podobnie mam słowo („hai how are you”), jak odwrócić ten ciąg znaków, przyjmując każdy znak za bajt.
user2720323,
@ user2720323 int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24); To dosłownie bierze każdy bajt, przesuwa go we właściwą pozycję i łączy się z innymi.
Neil,
2

Strumień bajtów jest uporządkowaną sekwencją bajtów. Jest pierwszy bajt, który nie ma poprzednika. Jego następcą jest drugi bajt i tak dalej. W dzisiejszych czasach bajt jest szeroko rozumiany jako składający się z ośmiu bitów. Jeśli chcemy być bardziej precyzyjni, używamy terminu strumień i oktet . Wciąż istnieją komputery z bajtami, które nie mają ośmiu bitów szerokości.

Szesnastkowy to sposób wpisywania liczb i służy jako drukowana reprezentacja danych binarnych. Szesnastkowy to tak naprawdę tekst. Na przykład wartość szesnastkowa FEmoże reprezentować bajt: bity, 11111110które mają wartość dziesiętną 255. Jednak FEw rzeczywistości jest ciąg znaków składający się ze znaków Fi E, co wymaga dwóch bajtów w US-ASCII lub ISO-646 zestaw znaków! Te dwa bajty są tym , co FE jest , a pojedynczy bajt o wartości 254 jest tym, co FE reprezentuje , jako notacja drukowana.

Jeśli kanał komunikacyjny lub uchwyt pliku lub jakieś takie urządzenie jest opisane jako przenoszące strumień bajtów i nie podano żadnych innych informacji, prawie na pewno nie oznacza, że ​​bajty są reprezentowane jako tekst szesnastkowy, więc każdy bajt abstrakcyjny w strumieniu wymaga dwa bajty fizyczne.

A surowe dane oznaczają po prostu bity, które nie są interpretowane jako posiadające jakąkolwiek strukturę poza „tablicą bitów”. Surowe dane zwykle mają strukturę i coś reprezentują, ale kiedy patrzymy na nie jako surowe dane, na razie ignorujemy interpretację (na przykład patrzymy na surową reprezentację typu danych, aby zweryfikować jego poprawność w dół do szczegółów na poziomie bitów) lub interpretacja nie jest dostępna (mamy pewne dane, ale nie rozumiemy ich struktury i tego, co reprezentuje).

Kaz
źródło
PDP-10 miał instrukcje radzenia sobie z bajtami o zmiennej wielkości. Najczęściej był to siedmiobitowy kod ASCII, po którym następowały sześciobitowe znaki.
kevin cline,
0

Bajt ma 8 bitów. Bit to 0 lub 1. „Surowe dane” to tylko przepływ jednego bajta po drugim. Strumień bajtów może pochodzić z pliku, połączenia sieciowego, serializowanego obiektu, generatora liczb losowych itp.

  • Istnieje kilka sposobów wyświetlania bajtu: dwójkowy (01110110), szesnastkowy = szesnastkowy (7C), ósemkowy (0271) lub dziesiętny (215). We wszystkich przypadkach maksymalna wartość wynosi 255 (podstawa 10).

  • Czasami bajty są przypisywane do znaków, takich jak ascii. Wpisz „ascii” w wierszu poleceń unixa, a otrzymasz dużą tabelę, która odwzorowuje wartości bajtów 0–255 lub (szesnastkę 0-FF) na powiązany znak. Na przykład spacja to x20, a „A” to x40. Zauważ, że niektóre wartości bajtów są mapowane w celu kontrolowania znaków i nie można ich wydrukować. Ale same bajty nie są znakami - to tylko pakiet bitów. Numer.

  • „odwróć 4 bajty” oznaczałoby pobranie niektórych bajtów 123 42 231 0 i odwrócenie kolejności - 0 231 42 123. W przypadku pary bajtów prawdopodobnie odczytałbym 4 bajty, odwrócił je, przeczytał 4 kolejne bajty itp. .

(BTW, ten problem jest istotny, ponieważ jeśli chcesz reprezentować liczbę większą niż 255 jako bajty, musisz użyć więcej niż jednego bajtu. Ale wtedy pytanie brzmi: czy „największy” bajt jest pierwszy, czy ostatni? To się nazywa big endian lub little endian - sprawdź te, aby uzyskać więcej informacji na temat tego, dlaczego warto przesuwać bajty w strumieniu surowych bajtów).

Obrabować
źródło