Was ist eigentlich ein Bytestream?

34

Kann mir jemand erklären, was Byte-Stream tatsächlich enthält? Enthält es nur Bytes (Hex-Daten) oder Binärdaten oder englische Buchstaben? Ich bin auch verwirrt über den Begriff "Rohdaten". Wenn jemand mich gebeten hat, "die 4-Byte-Daten umzukehren", was soll ich dann davon ausgehen, dass die Daten Hex-Code oder Binärcode sind?

user2720323
quelle
Meine zwei Cent sind keine würdige Antwort (und es gibt bereits gute unten), aber ich möchte nur Links zu diesen zwei Artikeln bereitstellen, die wahrscheinlich einen guten Einblick darüber geben, wie "Rohdaten" interpretiert werden, um tatsächlich etwas zu bedeuten (was nicht der Fall ist) Bedeuten Sie
Michael
1
Ich denke, Java hat ein Byte erstellt, um die Verwendung von c / c ++ 's char für Dinge zu vermeiden, die nicht als Zeichen verstanden werden können. char wurde häufig in c / c ++ verwendet, da die Größe von char 1 Byte beträgt. Auch Geräte unter Unix sind Block- und Zeichengeräte. Wenn Sie von Zeichengeräten lesen, erhalten Sie einen Strom von Zeichen / Bytes ohne Vorzeichen.
imel96
Byte-Stream ist nicht eindeutig. Oktett-Stream ist nicht.
Deer Hunter
Daten können auf vielen Ebenen interpretiert werden. Im Grunde ist es nur eine Reihe von Ein-Aus-elektrischen Ebenen. Etwas höher oben ist es ein Stück Bytes oder, wie Sie sagen, ein Bytestrom . Noch weiter oben beginnen Sie, die Rohdaten zu interpretieren. Bytes können auf viele Arten (Codierungen) als Text interpretiert werden. Auch ganzzahlige Zahlen (Big- oder Little-Endian). Sie können sogar höher gehen. Sie haben eine Zip-Datei. Diese Zip-Datei ist Ihr Backup von gestern. Und so weiter. Das Problem ist, dass das genaue Niveau oft implizit und nicht klar ist, und dies kann verwirrend sein.
Nalply

Antworten:

52

Byteströme enthalten auch Bytes. Zerlegt in das, was es eigentlich ist, sind es 8 Bits, die aus Einsen und Nullen bestehen. Wenn es eine Zahl darstellen würde, wäre es eine beliebige Zahl von 0 bis 255 (was, wie ich hinzufügen darf, kein Zufall ist, warum die 4 Zahlen in einer IP-Adresse immer im Bereich von 0 bis 255 liegen). Byte- Streams sind normalerweise hochentwickelte Schnittstellen, die das zugrunde liegende Basis-Byte-Array verbergen sollen, das zum Speichern eines Ringpuffers verwendet wird.

Was zum Teufel bedeutet das? Nun, es könnte eine Textdatei, ein Bild oder einen Live-Videostream darstellen. Was es ist, hängt ganz davon ab, wer es liest. Hex-Repräsentation ist eine andere Art, dasselbe zu sagen, obwohl es manchmal praktischer ist, Bytes in Bezug auf ihre Hex-Repräsentation anstatt Zahlen zu verwalten, aber es ist dasselbe.

Wenn Sie sich auf Rohdaten beziehen, beziehen Sie sich normalerweise auf Bytedaten. Die Daten kommen ohne einen Tag mit der Aufschrift "Ich bin eine Bilddatei!" Normalerweise beschäftigen Sie sich nur dann mit Rohdaten, wenn Sie sich nicht wirklich darum kümmern, was die Daten insgesamt darstellen. Wenn ich zum Beispiel ein Bild in seine Schwarzweiß-Version konvertieren möchte, würde ich sagen, dass ich die Rohdaten eines Bildes lesen und für jeweils 3 gelesene Bytes (was tatsächlich die Darstellung der roten Farbe, die Darstellung der grünen Farbe und die Darstellung von ist) blaue Farbe), addiere seinen Zahlenwert und dividiere durch 3, dann schreibe diesen Wert dreimal. Im Wesentlichen würde ich die Rot-, Grün- und Blau-Werte eines Pixels mitteln und daraus sein graues Äquivalentpixel bilden. Wenn Sie jedoch über das Ausführen von Vorgängen mit Daten auf der Ebene "byteweise" sprechen,

Oder Sie möchten eine Datei in einer Datenbank speichern, werden jedoch aufgefordert, ihre "Rohdaten" in einen Blob-Datentyp einzufügen. Dies bedeutet einfach, die Daten einer Datei in ein großes Byte-Array zu konvertieren, das die Datenbank verstehen und verwalten kann. Sie werden feststellen, dass es sich beim Abrufen dieses Werts aus der Datenbank einfach um ein großes Byte-Array handelt, wie Sie es anfangs für die Datenbank angegeben haben. Wenn diese Daten eine Datei waren, müssen Sie als Programmierer diese Bytedaten neu interpretieren, als würden Sie eine Datei jeweils byteweise lesen.

Wenn Sie jemand bittet, "die 4-Byte-Daten umzukehren", wird davon ausgegangen, dass es sich um eine Big-Endian- oder Little-Endian-Interpretation von Zahlen handelt, bei der Zahlen mit dem höchst- oder niedrigstwertigen Byte beginnen. Es spielt keine Rolle, ob eine Zahl als Big-Endian oder Little-Endian dargestellt wird, nur dass alle Systeme, die die Zahl lesen, sie konsistent interpretieren.

Dies bedeutet nicht, dass die tatsächliche Zahlendarstellung (oder Hexadezimaldarstellung) geändert wird, sondern lediglich, dass die Reihenfolge, in der diese 4 Bytes eine Zahl bilden, umgekehrt werden sollte. Angenommen, Sie haben 0x01, 0x02, 0x03 und 0x04. Um diese umzukehren, müssten Sie stattdessen 0x04, 0x03, 0x02, 0x01. Das System würde diese 4 Bytes vermutlich in umgekehrter Reihenfolge lesen, und da Sie sie bereits umgekehrt haben, wird der Wert so interpretiert, als ob er genau dem entspricht, was in den Rohdaten beabsichtigt war.

Ich hoffe das erklärt es!

Neil
quelle
Alles ist gut ..! Können Sie bitte die Antwort bezüglich "Rohdaten" erläutern?
user2720323
@ user2720323 Okay, geändert, um bessere "Rohdaten" zu erklären. :)
Neil
Beachten Sie Folgendes: Alle Daten sind einfach eine Sammlung von Bytes. Die Bedeutung dieser Bytes wird durch eine Art von Metadaten (Dateierweiterung, Datenbankfeld usw.) definiert. Eine Bilddatei kann als ASCII-Datei interpretiert werden und umgekehrt. Der Text oder das Bild mögen bedeutungslos sein, aber es ist immer noch möglich. (Derp ... ich hätte die nächsten Antworten lesen sollen)
Dave Nay
2
@ kevincline Bitte versuchen Sie zu verstehen, dass ich eine Idee vermitteln möchte. Es ist nicht meine Priorität, einen genauen Algorithmus zu schreiben. Wenn Sie genauer sein möchten, würden Sie die Rot-Grün- und Blau-Werte entsprechend der Wahrnehmung durch das menschliche Auge abwägen.
Neil
18

Ein Byte ist einfach eine Informationseinheit - es kann alles sein. Ein Byte an sich hat nichts zu bedeuten, man muss ihm irgendeine Bedeutung beimessen.

Also, um das zu erweitern -

Enthält es nur Bytes (Hex-Daten) oder Binärdaten oder englische Buchstaben?

Hex-Daten sind die gleichen wie Binärdaten. Es ist nur eine andere Art, die Daten anzuzeigen. Beispiel: 0x41 = 0b01000001 = 'A' = 65 (dezimal). Englische Buchstaben wären nur eine Teilmenge davon.

Wenn jemand mich gebeten hat, "die 4-Byte-Daten umzukehren", was soll ich dann davon ausgehen, dass die Daten Hex-Code oder Binärcode sind?

Da hex nur eine Darstellung der Daten ist, spielt es keine Rolle, wie Sie darüber denken. Wenn Sie Daten von haben 0x65 0x66 0x67 0x68, um es umzukehren, würden Sie erhalten 0x68 0x67 0x66 0x65. Wenn Sie diese Daten in Zeichenform betrachten würden, hätten Sie sie ursprünglich A B C D, jetzt jedoch D C B A.

Zurück zu einem Bytestrom - es ist nur eine Folge von Daten. Sie müssen wissen, was die Daten darstellen, um sie verwenden zu können. Wenn wir eine Textdatei lesen, handelt es sich bei dem Byte-Stream, den Sie beim Lesen der Datei erhalten, lediglich um Zeichen. Eine ausführbare Datei enthält eine Reihe nicht druckbarer Zeichen, weshalb sie als Binärdatei bezeichnet wird. Natürlich ist es möglich, eine ausführbare Datei in einem Texteditor zu öffnen, aber es macht nichts Sinn.

rm5248
quelle
1
+1, aber die Betonung der Binärzahl im Lat-Bit scheint fehl am Platz zu sein. "Binärdaten" enthalten häufig nicht druckbare Zeichen, werden jedoch als "binär" bezeichnet, da sie aus Binärziffern bestehen und nicht aus nicht druckbaren Zeichen. Ich verstehe, dass Sie "Binär" im Gegensatz zu druckbaren "Text" -Daten verwenden, aber ich denke, dies kann das OP noch weiter verwirren.
Caleb
Ich habe eine Frage bezüglich der Umkehrung. Wenn ich eine Ganzzahl (32 Bit) 325487 in einer Datei habe, wie kann ich diese 4-Byte-Ganzzahl umkehren? Ebenso habe ich ein Wort ("hai wie geht es dir"), wie man diese Zeichenkette umkehrt, indem man jedes Zeichen als Byte annimmt.
user2720323
@ user2720323 int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24); Dies nimmt buchstäblich jedes Byte, verschiebt es in die richtige Position und kombiniert es mit den anderen.
Neil
2

Ein Bytestrom ist eine geordnete Folge von Bytes. Es gibt ein erstes Byte, das keinen Vorgänger hat. Sein Nachfolger ist das zweite Byte und so weiter. Heutzutage besteht ein Byte weithin aus acht Bits. Um genauer zu sein, verwenden wir die Begriffe Oktett-Stream und Oktett . Es gibt immer noch Computer mit Bytes, die nicht acht Bits breit sind.

Hexadezimal ist eine Schreibweise für Zahlen und dient als gedruckte Darstellung für Binärdaten. Hexadezimal ist eigentlich Text. Beispielsweise FEkönnte der Hexadezimalwert ein Byte darstellen: die Bits 11111110, die den Dezimalwert haben 255. Tatsächlich FEhandelt es sich jedoch um eine Zeichenkette bestehend aus den Zeichen Fund E, die zwei Bytes im US-ASCII- oder ISO-646-Zeichensatz benötigt! Diese zwei Bytes ist , was FE ist , und das einzelne Byte mit Wert 254 ist , was die FE darstellt , wie eine gedruckte Notation.

Wenn ein Kommunikationskanal, ein Datei-Handle oder ein solches Gerät als Byte-Stream tragend beschrieben wird und keine anderen Informationen angegeben werden, bedeutet dies mit ziemlicher Sicherheit nicht , dass Bytes als hexadezimaler Text dargestellt werden, sodass jedes abstrakte Byte im Stream dies erfordert zwei physikalische Bytes.

Und Rohdaten bedeuten einfach Bits, die nicht dahingehend interpretiert werden, dass sie eine Struktur haben, die über das "Array von Bits" hinausgeht. Rohdaten haben normalerweise eine Struktur und stellen etwas dar. Wenn wir sie jedoch als Rohdaten betrachten, ignorieren wir entweder die Interpretation für den Moment (zum Beispiel betrachten wir die Rohdarstellung eines Datentyps, um ihre Richtigkeit zu überprüfen) auf Bitebene), oder die Interpretation ist nicht verfügbar (wir haben einige Daten, aber wir verstehen nicht die Struktur der Daten und was sie darstellen).

Kaz
quelle
Der PDP-10 hatte Anweisungen, um mit Bytes variabler Größe umzugehen. Am häufigsten wurden Sieben-Bit-ASCII-Zeichen gefolgt von Sechs-Bit-Zeichen verwendet.
Kevin Cline
0

Ein Byte besteht aus 8 Bits. Ein Bit ist 0 oder 1. Die "Rohdaten" sind nur ein Fluss von einem Byte nach dem anderen. Ein Bytestream kann aus einer Datei, einer Netzwerkverbindung, einem serialisierten Objekt, einem Zufallszahlengenerator usw. stammen.

  • Es gibt verschiedene Möglichkeiten, ein Byte anzuzeigen: binär (01110110), hexadezimal = hexadezimal (7C), oktal (0271) oder dezimal (215). In allen Fällen beträgt der Maximalwert 255 (Basis 10).

  • Manchmal werden Zeichen wie ASCII Bytes zugewiesen. Geben Sie "ascii" in eine Unix-Befehlszeile ein, und Sie erhalten eine große Tabelle, die die Bytewerte 0-255 oder (0-FF hex) dem zugeordneten Zeichen zuordnet. Beispielsweise ist der Abstand x20 und "A" x40. Beachten Sie, dass einige Bytewerte Steuerzeichen zuordnen und nicht gedruckt werden können. Aber die Bytes selbst sind keine Zeichen - sie sind nur ein Bündel von Bits. Eine Zahl.

  • "4 Bytes umkehren" würde bedeuten, einige Bytes 123 42 231 0 zu nehmen und die Reihenfolge umzukehren - 0 231 42 123. Auf einen Bytedampf angewendet würde ich wahrscheinlich 4 Bytes lesen, sie umkehren, die nächsten 4 Bytes lesen usw .

(Übrigens ist dieses Problem relevant, denn wenn Sie eine Zahl größer als 255 als Bytes darstellen möchten, müssen Sie mehr als ein Byte verwenden. Aber dann lautet die Frage: Kommt das "größte" Byte zuerst oder zuletzt? Das heißt Big Endian oder Little Endian - suchen Sie nach Hintergrundinformationen, warum es nützlich ist, in einem Raw-Byte-Stream um die Bytes zu mischen.)

rauben
quelle