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?
stream-processing
użytkownik2720323
źródło
źródło
Odpowiedzi:
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!
źródło
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ę -
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.
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.
źródło
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.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
FE
może reprezentować bajt: bity,11111110
które mają wartość dziesiętną255
. JednakFE
w rzeczywistości jest ciąg znaków składający się ze znakówF
iE
, co wymaga dwóch bajtów w US-ASCII lub ISO-646 zestaw znaków! Te dwa bajty są tym , coFE
jest , a pojedynczy bajt o wartości 254 jest tym, coFE
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).
źródło
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).
źródło