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

34

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

utilisateur2720323
la source
Mes deux cents ne sont pas dignes de réponse (et il y en a déjà de bons ci-dessous) mais je veux juste fournir des liens vers ces 2 articles qui donneront probablement une bonne idée de la façon dont les "données brutes" sont interprétées comme signifiant réellement quelque chose rien dire sauf si vous savez ce qu'il est censé représenter et comment il est codé / stocké) betterexplained.com/articles/… joelonsoftware.com/articles/Unicode.html
Michael
1
Je pense que java a créé byte pour éviter d’utiliser le caractère de c / c ++ pour des choses qui ne peuvent pas être comprises comme un caractère. char a été beaucoup utilisé dans c / c ++ car sa taille est de 1 octet. Les périphériques sous Unix sont également des périphériques de type bloc et caractère. Si vous lisez à partir de périphériques char, vous obtenez un flux de caractères / octets non signés.
Imel96
Le flux d'octets est ambigu. Octet flux n'est pas.
Deer Hunter
Les données peuvent être interprétées à plusieurs niveaux. Au bas, il ne s'agit que d'une série de niveaux électriques marche-arrêt. Un peu plus haut, c'est un bloc d'octets ou, comme vous le dites, un flux d'octets . Encore plus haut, vous commencez à interpréter les données brutes. Les octets peuvent être interprétés comme du texte de plusieurs manières (encodages). Nombre entier également (grand ou petit endien). Vous pouvez même aller plus haut. Vous avez un fichier zip. Ce fichier zip est votre sauvegarde d'hier. Etc. Le problème est que le niveau exact est souvent implicite et non précisé, ce qui peut prêter à confusion.
Nalply

Réponses:

52

Les flux d'octets contiennent, ainsi, des octets. Décomposé en ce qu’il est en réalité, il s’agit de 8 bits composés de 1 et de 0. S'il s'agissait d'un nombre, ce serait n'importe quel nombre compris entre 0 et 255 (ce qui, permettez-moi d'ajouter, n'est pas une coïncidence si les 4 chiffres d'une adresse IP vont toujours de 0 à 255). Les flux d' octets 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, puis il remplit simplement à nouveau le tampon).

Qu'est-ce que ça représente? 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 est lu. 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 qu'en chiffres, 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 en 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 version noir et blanc, je pourrais peut-être lire les données brutes d'une image et pour chaque lecture de 3 octets (ce qui serait en fait une représentation de la couleur rouge, une représentation de la couleur verte et une représentation de l'image). couleur bleue), ajoutez sa valeur numérique et divisez-la par 3, puis écrivez cette valeur 3 fois. Essentiellement, je ferais la moyenne des valeurs de rouge, de vert et de bleu d'un pixel pour en faire son pixel équivalent gris. Cependant, lorsque vous parlez d'effectuer des opérations sur des données au niveau "octet par octet", vous ne

Ou peut-être souhaitez-vous enregistrer un fichier dans une base de données, mais il vous est demandé 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 tableau d'octets volumineux que la base de données peut comprendre et gérer. Vous constaterez que lorsque vous récupérerez cette valeur dans la base de données, il s'agira simplement d'un tableau d'octets volumineux tel que vous l'aviez 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'octet comme si vous lisiez un fichier octet à la fois.

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

Cela ne veut pas dire que la représentation du nombre réel (ou la représentation hexadécimale est changée), mais simplement que l'ordre dans lequel ces 4 octets font un nombre doit être inversé. Alors disons que vous avez 0x01, 0x02, 0x03 et 0x04. Pour inverser cela, vous auriez plutôt 0x04, 0x03, 0x02, 0x01. Le système lirait probablement ces 4 octets dans l’ordre inverse et, comme vous l’avez déjà inversée, la valeur est interprétée comme étant identique à celle prévue dans les données brutes.

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

Neil
la source
Tout va bien ..! Pouvez-vous préciser la réponse concernant les "données brutes"?
user2720323
@ user2720323 Ok, modifié pour mieux expliquer les "données brutes". :)
Neil
Une chose à garder à l'esprit… toutes les données sont simplement une collection d'octets. La signification de ces octets est définie par une sorte de métadonnée (extension de fichier, champ de base de données, etc.). Un fichier image peut être interprété comme un fichier ASCII et inversement. Le texte ou l'image n'a peut-être pas de sens, mais c'est toujours possible. (Derp ... j'aurais dû lire les réponses suivantes)
Dave Nay
2
@kevincline S'il vous plaît, essayez de comprendre le fait que j'essaie de transmettre une idée. Ma priorité n'est pas d'écrire un algorithme précis. Si vous voulez être plus précis, pesez les valeurs rouge vert et bleu en fonction de ce que l'œil humain peut percevoir.
Neil
18

Un octet est simplement une unité d'information - cela peut être n'importe quoi. Un octet en soi ne veut rien dire, vous devez lui attribuer un sens.

Alors, pour développer cela -

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

Les données hexadécimales sont identiques aux 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 me demande "d'inverser les données sur 4 octets", alors que devrais-je supposer que les données sont du code hexadécimal ou du code binaire?

Puisque hex est juste une représentation des données, peu importe comment vous y pensez. Si vous avez des données de 0x65 0x66 0x67 0x68, pour l’inverser, vous obtiendrez 0x68 0x67 0x66 0x65. Si vous examiniez ces données en termes de caractères, vous les auriez à l’origine A B C D, mais vous l’avez maintenant 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 obtiendriez lorsque vous le liriez ne serait que des caractères. Un fichier exécutable aurait un tas de caractères non imprimables, raison pour laquelle il s’appellerait un fichier binaire . Clairement, il est possible d’ouvrir un fichier exécutable dans un éditeur de texte, mais cela n’a aucune utilité.

rm5248
la source
1
+1 mais l'accent mis sur le binaire dans le dernier bit semble mal placé. Les "données binaires" contiennent souvent des caractères non imprimables, mais elles sont appelées "binaires" car elles sont composées de chiffres binaires et non parce qu'elles contiennent des caractères non imprimables. Je comprends que vous utilisez "binaire" par opposition aux données imprimables "texte", mais je pense que cela risque de perturber davantage le PO.
Caleb
J'ai une question concernant l'inversion. Si j'ai un nombre entier (32 bits) 325487 dans un fichier, comment puis-je inverser cet entier de 4 octets? De même, j'ai un mot ("hai comment vas-tu"), comment inverser cette chaîne en supposant que chaque caractère est un octet.
user2720323
@ user2720323 int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24); Cela prend littéralement chaque octet, le décale dans la bonne position et se combine avec les autres.
Neil
2

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

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 un texte. Par exemple, la valeur hexadécimale FEpeut représenter un octet: les bits 11111110qui ont la valeur décimale 255. Cependant, il FEs’agit en réalité d’une chaîne de caractères composée des caractères Fet E, qui nécessite deux octets dans le jeu de caractères US-ASCII ou ISO-646! Ces deux octets sont ce qui FE est , et le seul octet avec la valeur 254 est ce que FE représente , en tant que notation imprimée.

Si un canal de communication, un descripteur de fichier ou un périphérique de ce type est décrit comme transportant un flux d'octets, et qu'aucune autre information n'est donnée, cela ne signifie certainement pas 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 désignent simplement les 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 en vérifier l'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’elle représente).

Kaz
la source
Le PDP-10 avait reçu des instructions pour gérer des octets de taille variable. Le plus courant était l'ASCII à sept bits, suivi de caractères à six bits.
Kevin Cline
0

Un octet est 8 bits. Un bit vaut 0 ou 1. La "donnée brute" est simplement un flux d'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 manières d'afficher un octet: binaire (01110110), hex = hexidécimal (7C), octal (0271) ou décimal (215). Dans tous les cas, la valeur maximale est de 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 mappera les valeurs d'octet 0-255 ou (0-FF hex) au caractère associé. Par exemple, l'espace est x20 et "A" est x40. Notez que certaines valeurs d'octet correspondent aux caractères de contrôle 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" consisterait à prendre quelques octets 123 42 231 0 et à inverser la commande - 0 231 42 123. Appliqué à un octet steam, je lirais probablement 4 octets, inverserais-le, lirais les 4 octets suivants, etc. .

(BTW, ce problème est pertinent, car si vous voulez représenter un nombre supérieur à 255, vous devez utiliser plus d'un octet. Mais la question est de savoir si le "plus grand" octet vient en premier ou en dernier? big endian ou little endian - recherchez-les plus en détail sur l’utilité de mélanger les octets dans un flux d’octets brut.)

Rob
la source