web-dev-qa-db-fra.com

Qu'est-ce qu'un flux d'octets en fait?

Quelqu'un peut-il m'expliquer ce que le flux d'octets contient réellement? Contient-il uniquement des octets (données hexadécimales) ou des données binaires ou des lettres anglaises? Je suis également confus au sujet du terme "données brutes". Si quelqu'un m'a demandé de "renverser les données de 4 octets", alors que dois-je supposer que les données sont du code hexadécimal ou binaire?

35
user2720323

Les flux d'octets contiennent, bien, des octets. Décomposé en ce qu'il est réellement, il s'agit de 8 bits composés de 1 et de 0. S'il représentait un nombre, ce serait n'importe quel nombre de 0 à 255 (ce qui, je peux ajouter, n'est pas une coïncidence pourquoi les 4 chiffres d'une adresse IP vont toujours de 0 à 255). Byte streams sont généralement des interfaces sophistiquées destinées à masquer le tableau d'octets de base sous-jacent utilisé pour contenir un tampon circulaire (vous remplissez le tampon et attendez que quelqu'un le vide, auquel cas il remplit simplement le tampon encore).

Qu'est-ce que ça représente? Eh bien, cela pourrait représenter un fichier texte, une image ou un flux vidéo en direct. Ce qu'il est dépend entièrement du contexte de qui le lit. La représentation hexadécimale est une autre façon de dire la même chose, bien qu'il soit parfois plus pratique de gérer les octets en termes de représentation hexadécimale plutôt que de nombres, mais c'est la même chose.

Lorsque vous faites référence à des données brutes, vous faites généralement référence à des données d'octets. Les données sont fournies sans étiquette indiquant "Je suis un fichier image!" Habituellement, vous ne traitez que des données brutes lorsque vous ne vous souciez pas vraiment de ce que les données représentent globalement. Par exemple, si je voulais convertir une image en sa version noir et blanc, je pourrais dire de lire les données brutes d'une image et pour chaque 3 octets lus (ce qui serait en fait la représentation de la couleur rouge, la représentation de la couleur verte et la représentation de couleur bleue), ajoutez sa valeur numérique et divisez par 3, puis écrivez cette valeur 3 fois. Essentiellement, je ferais la moyenne des valeurs rouges, vertes et bleues d'un pixel et en ferait son pixel équivalent gris à partir de cela. Cependant, lorsque vous parlez d'effectuer des opérations sur des données au niveau "octet par octet", vous ne vous souciez pas vraiment de la situation dans son ensemble, pour ainsi dire.

Ou, vous souhaitez peut-être enregistrer un fichier dans une base de données, mais il vous demande d'insérer ses "données brutes" dans un type de données blob. Cela signifie simplement convertir les données d'un fichier en un grand tableau d'octets que la base de données peut comprendre et gérer. Vous constaterez que lorsque vous récupérerez cette valeur de la base de données, ce sera simplement un grand tableau d'octets comme vous l'avez initialement fourni à la base de données. Si ces données étaient un fichier, vous, le programmeur, devez réinterpréter ces données d'octets comme si vous lisiez un fichier un octet à la fois.

Si quelqu'un vous demandait de "renverser les données de 4 octets", je suppose que cela fait référence à une interprétation big-endian vs little-endian des nombres, qui écrit des nombres commençant par l'octet le plus ou le moins significatif. Peu importe si un nombre est représenté comme big-endian ou little-endian, juste que tous les systèmes lisant le nombre l'interprètent de manière cohérente.

Cela ne veut pas dire que la représentation réelle du nombre (ou la représentation hexadécimale d'ailleurs) est modifiée, simplement que l'ordre dans lequel ces 4 octets font un nombre doit être inversé. Disons que vous avez 0x01, 0x02, 0x03 et 0x04. Pour les inverser, vous auriez à la place 0x04, 0x03, 0x02, 0x01. Le système lirait vraisemblablement ces 4 octets dans l'ordre inverse et puisque vous l'avez déjà inversé, la valeur est interprétée comme étant la même que celle prévue dans les données brutes.

J'éspère que ça l'explique!

52
Neil

Un octet est simplement une unité d'information - il peut être n'importe quoi. Un octet en lui-même ne veut rien dire, vous devez lui attacher une sorte de sens.

Donc, pour développer cela -

Contient-il uniquement des octets (données hexadécimales) ou des données binaires ou des lettres anglaises?

Les données hexadécimales sont les mêmes que les données binaires. C'est juste une façon différente d'afficher les données. Par exemple, 0x41 = 0b01000001 = 'A' = 65 (décimal). Les lettres anglaises ne seraient qu'un sous-ensemble de cela.

Si quelqu'un m'a demandé de "renverser les données de 4 octets", alors que dois-je supposer que les données sont du code hexadécimal ou binaire?

Comme hex n'est qu'une représentation des données, peu importe comment vous en pensez. Si vous avez des données de 0x65 0x66 0x67 0x68, pour l'inverser, vous obtiendrez 0x68 0x67 0x66 0x65. Si vous regardiez ces données en termes de caractères, vous auriez à l'origine A B C D, mais maintenant vous avez D C B A.

Retour à un flux d'octets - c'est juste une séquence de données. Vous devez savoir ce que les données représentent pour pouvoir les utiliser. Si nous lisons un fichier texte, le flux d'octets que vous obtiendrez lorsque vous lirez le fichier ne sera que des caractères d'une certaine sorte. Un fichier exécutable aurait un tas de caractères non imprimables, c'est pourquoi il serait appelé fichier binaire. De toute évidence, il est possible d'ouvrir un exécutable dans un éditeur de texte, mais cela ne fait rien d'utile.

19
rm5248

Un flux d'octets est une séquence ordonnée d'octets. Il y a un premier octet, qui n'a pas de prédécesseur. Son successeur est le deuxième octet, etc. De nos jours, un octet est généralement compris comme étant composé de huit bits. Si nous voulons être plus précis, nous utilisons les termes flux d'octets et octet . Il existe toujours des ordinateurs dont les octets n'ont pas une largeur de huit bits.

L'hexadécimal est un moyen d'écrire des nombres et sert de représentation imprimée pour les données binaires. Hexadécimal est en fait du texte. Par exemple, la valeur hexadécimale FE peut représenter un octet: les bits 11111110 qui ont la valeur décimale 255. Cependant, FE est en fait une chaîne de caractères composée des caractères F et E, ce qui nécessite deux octets dans le US-ASCII ou l'ISO-646 jeu de caractères! Ces deux octets sont ce que FEis, et le seul octet avec la valeur 254 est ce que le FE représente , sous forme de notation imprimée.

Si un canal de communication, un descripteur de fichier ou un tel périphérique est décrit comme transportant un flux d'octets et qu'aucune autre information n'est donnée, cela signifie presque certainement pas signifie que les octets sont représentés sous forme de texte hexadécimal, de sorte que chaque octet abstrait du flux nécessite deux octets physiques.

Et les données brutes signifient simplement des bits qui ne sont pas interprétés comme ayant une structure au-delà du "tableau de bits". Les données brutes ont généralement une structure et représentent quelque chose, mais lorsque nous les considérons comme des données brutes, nous ignorons l'interprétation pour le moment (par exemple, nous examinons la représentation brute d'un type de données pour vérifier son exactitude). au niveau des bits), ou l'interprétation n'est pas disponible (nous avons des données, mais nous ne comprenons pas la structure des données et ce qu'elles représentent).

2
Kaz

Un octet fait 8 bits. Un bit vaut 0 ou 1. Les "données brutes" ne sont qu'un flux d'un octet après l'autre. Un flux d'octets peut provenir d'un fichier, d'une connexion réseau, d'un objet sérialisé, d'un générateur de nombres aléatoires, etc.

  • Il existe plusieurs façons d'afficher un octet: binaire (01110110), hex = hexidécimal (7C), octal (0271) ou décimal (215). Dans tous les cas, la valeur maximale est 255 (base 10).

  • Parfois, des octets sont attribués à des caractères, comme ascii. Tapez "ascii" sur une ligne de commande unix, et vous obtiendrez un grand tableau qui mappe les valeurs d'octet 0-255 ou (hex 0-FF) au caractère associé. Par exemple, l'espace est x20 et "A" est x40. Notez que certaines valeurs d'octets mappent pour contrôler les caractères et ne sont pas imprimables. Mais les octets eux-mêmes ne sont pas des caractères - ils ne sont qu'un paquet de bits. Un numéro.

  • "inverser 4 octets" serait de prendre quelques octets 123 42 231 0 et de retourner l'ordre - 0 231 42 123. Appliqué à un octet Steam, je lirais probablement 4 octets, les inverserais, lirais les 4 octets suivants, etc. .

(BTW, ce problème est pertinent, car si vous voulez représenter un nombre supérieur à 255 comme octets, vous devez utiliser plusieurs octets. Mais alors la question est, le "plus grand" octet vient-il en premier ou en dernier? big endian or little endian - recherchez ceux-ci pour plus d'informations sur les raisons pour lesquelles il est utile de parcourir les octets dans un flux d'octets bruts.)

0
Rob