Czym właściwie jest strumień bajtów?

Czy ktoś może mi wyjaśnić, jaki strumień bajtów faktycznie zawiera? Czy zawiera tylko bajty (dane szesnastkowe), dane binarne lub tylko angielskie litery? Nie rozumiem też terminu „surowe dane”. Gdyby ktoś poprosił mnie o „odwrócenie 4-bajtowych danych”, to co mam założyć, że dane są kodem szesnastkowym lub binarnym?

Komentarze

  • Moje dwa centy nie są godne odpowiedzi (a poniżej są już dobre), ale chcę tylko podać linki do tych dwóch artykułów, które prawdopodobnie zapewnią dobry wgląd w to, jak ” surowe dane ” jest interpretowane jako faktycznie coś znaczącego (nie ' nic nie znaczy, chyba że wiesz, co ma reprezentować i jak jest zakodowane / przechowywane) betterexplained.com/articles/… joelonsoftware. com / article / Unicode.html
  • Myślę, że java utworzył bajt, aby uniknąć używania znaku c / c ++ ' dla rzeczy, które mogą ' nie należy rozumieć jako znaku. char był często używany w c / c ++, ponieważ rozmiar znaku to 1 bajt. Również urządzenia w systemie Unix są urządzeniami blokowymi i znakowymi. Jeśli czytasz z urządzeń typu char, otrzymujesz strumień bez znaku / bajtów.
  • Strumień bajtów jest niejednoznaczny. Strumień oktetu nie jest.
  • Dane mogą być interpretowane na wielu poziomach. U dołu jest to ' seria elektrycznych poziomnic włączających i wyłączających. Nieco wyżej ' to porcja bajtów lub, jak mówisz, strumień bajtów . Jeszcze wyżej zaczynasz interpretować surowe dane. Bajty można interpretować jako tekst na wiele sposobów (kodowanie). Liczby całkowite również (duży lub mały endian). Możesz nawet wejść wyżej. Masz plik zip. Ten plik zip to kopia zapasowa z wczoraj. I tak dalej. Problem polega na tym, że dokładny poziom jest często ukryty i niejasny, co może być mylące.

Odpowiedź

Strumienie bajtowe zawierają, no cóż, bajty. W podziale na to, czym jest w rzeczywistości, jest to 8 bitów składających się z jedynek i zer. Gdyby reprezentował liczbę, byłaby to dowolna liczba od 0 do 255 (co, dodam, nie jest przypadkiem, dlaczego 4 liczby w adresie IP zawsze mieszczą się w zakresie od 0 do 255). Bajtowe strumienie są zwykle wyrafinowanymi interfejsami mającymi na celu ukrycie podstawowej tablicy bajtów używanej do przechowywania bufora cyklicznego (zapełniasz bufor i czekasz aż ktoś go opróżni, po czym po prostu zapełnia bufor jeszcze raz).

Co to u licha oznacza? Cóż, może reprezentować plik tekstowy, obraz lub strumień wideo na żywo. To, czym jest , jest całkowicie zależne od kontekstu tego, kto ją czyta. Reprezentacja szesnastkowa to inny sposób powiedzenia tego samego, chociaż czasami wygodniej jest zarządzać bajtami w kategoriach ich reprezentacji szesnastkowej, a nie liczb, ale to jest to samo.

Kiedy „odnosisz się do surowych danych, zwykle odnosisz się do danych bajtowych. Dane są dostarczane bez tagu z napisem„ Jestem plikiem obrazu! ”Zwykle masz do czynienia z surowymi danymi tylko wtedy, gdy tego nie robisz” Nie obchodzi mnie, co ogólnie reprezentują dane. Na przykład, gdybym chciał przekonwertować obraz do jego wersji czarno-białej, mógłbym powiedzieć, żebym odczytywał nieprzetworzone dane obrazu i dla każdych trzech odczytanych bajtów (co w rzeczywistości byłoby reprezentacją koloru czerwonego, reprezentacją koloru zielonego i reprezentacja koloru niebieskiego), dodaj wartość liczbową i podziel przez 3, a następnie zapisz tę wartość 3 razy. W zasadzie to, co bym robił, to uśrednianie wartości czerwonego, zielonego i niebieskiego piksela i tworzenie z tego szarego odpowiednika piksela Jednakże, kiedy mówisz o wykonywaniu operacji na danych na poziomie „bajt po bajcie”, nie przejmujesz się tak naprawdę dużym obrazem, że tak powiem.

A może chcesz zapisać plik w bazie danych, ale prosi o wstawienie jego „surowych danych” do typu danych typu blob. Oznacza to po prostu przekształcenie danych pliku w dużą tablicę bajtów, którą baza danych może zrozumieć i zarządzać. Przekonasz się, że kiedy pobierzesz tę wartość z bazy danych, będzie to po prostu jedna duża tablica bajtów, jaką początkowo przekazałeś do bazy danych. Jeśli te dane były plikiem, to programista musi ponownie zinterpretować ten bajt tak jakbyś czytał plik po jednym bajcie na raz.

Gdyby ktoś poprosił Cię o „odwrócenie danych 4-bajtowych”, założyłbym, że odnosi się to do interpretacji liczb typu big-endian vs little-endian , który 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, tylko że wszystkie systemy odczytujące liczbę interpretują ją konsekwentnie.

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

Mam nadzieję, że to wyjaśnia!

Komentarze

  • Wszystko w porządku ..! Czy możesz uściślić odpowiedź na podstawie ” surowych danych „?
  • @ user2720323 OK, zmodyfikowano, by lepiej wyjaśniać ” surowe dane. ” 🙂
  • Należy pamiętać o jednej rzeczy … wszystkie dane to po prostu zbiór bajtów. Znaczenie tych bajtów jest określone przez pewien rodzaj metadanych (rozszerzenie pliku, pole bazy danych itp.). Plik obrazu można zinterpretować jako plik ASCII i odwrotnie. Tekst lub obraz mogą być bez znaczenia, ale nadal jest to możliwe. (Derp … powinienem był przeczytać następne odpowiedzi)
  • @kevincline Spróbuj docenić fakt, że ' staram się przekazać jakiś pomysł. Moim priorytetem nie jest ' t napisanie dokładnego algorytmu. Jeśli chcesz być dokładniejszy, ' d zważ wartości czerwieni, zieleni i niebieskiego zgodnie z tym, co może dostrzec ludzkie oko.

Odpowiedź

Bajt to po prostu jednostka informacji – może to być wszystko. Bajt sam w sobie nic nie znaczy, musisz nadać mu jakieś znaczenie.

Aby to rozwinąć –

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

Dane szesnastkowe to to samo, co 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 podzbiorem tego.

Gdyby ktoś poprosił mnie o „odwrócenie 4-bajtowych danych”, to powinienem przyjąć, że dane są kod szesnastkowy czy kod binarny?

Ponieważ szesnastkowy jest tylko reprezentacją danych, nie ma znaczenia, jak myślisz o tym. Jeśli masz dane 0x65 0x66 0x67 0x68, aby je odwrócić, otrzymasz 0x68 0x67 0x66 0x65. Gdybyś spojrzał na te dane pod kątem znaków, początkowo miałbyś A B C D, ale teraz masz D C B A.

Wróć do strumienia bajtów – to to tylko sekwencja danych. Aby z nich skorzystać, musisz wiedzieć, co przedstawiają dane. Jeśli czytamy plik tekstowy, strumień bajtów, który można uzyskać podczas czytania pliku, byłby po prostu jakimś rodzajem znaków. Plik wykonywalny zawierałby kilka niedrukowalnych znaków, dlatego zostałby nazwany plikiem binarnym . Oczywiście możliwe jest otwarcie pliku wykonywalnego w edytorze tekstu, ale nie robi to nic użytecznego.

Komentarze

  • +1 ale nacisk na binarny w bicie lat wydaje się nie na miejscu. ” dane binarne ” często zawierają znaki niedrukowalne, ale ' nazywa się ” binarny „, ponieważ ' składa się z cyfr binarnych, a nie dlatego, że zawiera znaki niedrukowalne . Rozumiem, że ' używasz ” binarnego ” w przeciwieństwie do drukowalnego ” text ” dane, ale myślę, że może to jeszcze bardziej zmylić PO.
  • Mam jedno pytanie dotyczące odwrócenia. , Jeśli mam liczbę całkowitą (32-bitową) 325487 w pliku, jak mogę odwrócić tę 4-bajtową liczbę całkowitą? podobnie mam słowo (” hai how are you „), jak odwrócić ten ciąg, przyjmując każdy znak jako bajt.
  • @ user2720323 int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24); To dosłownie pobiera każdy bajt, przesuwa go we właściwej pozycji i łączy z innymi.

Odpowiedź

Strumień bajtów to uporządkowana sekwencja bajtów. Istnieje pierwszy bajt, który nie ma poprzednika. Jego następcą jest drugi bajt i tak dalej. Obecnie powszechnie przyjmuje się, że bajt składa się z ośmiu bitów. Jeśli chcemy być bardziej precyzyjni, używamy określenia strumień oktetu i oktet . Nadal istnieją komputery z bajtami o szerokości mniejszej niż osiem bitów.

Szesnastkowy jest sposobem zapisywania liczb i służy jako drukowana reprezentacja danych binarnych. Szesnastkowy to w rzeczywistości tekst . Na przykład wartość szesnastkowa FE może reprezentować bajt: bity 11111110, które mają wartość dziesiętną 255.Jednak FE jest w rzeczywistości ciągiem znaków składającym się ze znaków F i E, co wymaga dwa bajty w zestawie znaków US-ASCII lub ISO-646! Te dwa bajty to FE , a pojedynczy bajt o wartości 254 jest tym, co FE reprezentuje , jako notacja drukowana.

Jeśli opisano kanał komunikacyjny, uchwyt pliku lub inne takie urządzenie jako przenoszący 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 abstrakcyjny bajt w strumieniu wymaga dwóch bajtów fizycznych.

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

Komentarze

  • PDP-10 zawiera instrukcje dotyczące bajtów o zmiennej wielkości. Najpopularniejszy był siedmiobitowy ASCII, po którym następowały sześciobitowe znaki.

Odpowiedź

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

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

  • Czasami bajty są przypisywane do znaków, np. Ascii. Wpisz „ascii” w wierszu poleceń unix, a otrzymasz dużą tabelę, która odwzorowuje wartości bajtów 0-255 lub (0-FF szesnastkowo) na skojarzony znak. Na przykład spacja to x20, a „A” to x40 Zauważ, że niektóre wartości bajtów odwzorowują znaki kontrolne i nie są drukowane. Ale same bajty nie są znakami – są tylko zbiorem bitów. Liczba.

  • „odwrócenie 4 bajtów” oznaczałoby zajęcie kilku bajtów 123 42 231 0 i odwrócenie kolejności – 0 231 42 123. Zastosowane do bajtów pary, I „d prawdopodobnie przeczytaj 4 bajty, odwróć je, przeczytaj następne 4 bajty itp.

(Przy okazji ten problem jest istotny, ponieważ jeśli chcesz przedstawić liczbę większą niż 255 jako pauza, musisz użyć więcej niż jednego bajtu. Ale pytanie brzmi: czy „największy” bajt jest pierwszy, czy ostatni? To się nazywa big endian lub little endian – poszukaj w nich więcej informacji o tym, dlaczego przydatne jest mieszanie bajtów w surowym strumieniu bajtów.)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *