Che cos'è effettivamente un flusso di byte?


34

Qualcuno può spiegarmi cosa contiene effettivamente il flusso di byte? Contiene byte (dati esadecimali) o dati binari o solo lettere inglesi? Sono anche confuso sul termine "dati grezzi". Se qualcuno mi chiedesse di "invertire i dati a 4 byte", allora cosa dovrei supporre che i dati siano codice esadecimale o codice binario?


I miei due centesimi non sono una risposta degna (e ce ne sono già buoni di seguito) ma voglio solo fornire collegamenti a questi 2 articoli che probabilmente forniranno una buona visione di come i "dati grezzi" vengono interpretati per significare effettivamente qualcosa (non significa nulla a meno che tu non sappia cosa dovrebbe rappresentare e come viene codificato / memorizzato) betterexplained.com/articles/… joelonsoftware.com/articles/Unicode.html
Michael

1
Penso che java abbia creato byte per evitare di usare il carattere c / c ++ per cose che non possono essere comprese come un personaggio. char è stato usato molto in c / c ++ perché la dimensione di char è 1 byte. Anche i dispositivi in ​​unix sono dispositivi a blocchi e caratteri. Se leggi da dispositivi char, ottieni stream di caratteri / byte non firmati.
imel96,

Il flusso di byte è ambiguo. Il flusso di ottetti non lo è.
Deer Hunter,

I dati possono essere interpretati su molti livelli. In fondo è solo una serie di livelli elettrici on-off. Un po 'più in alto è una porzione di byte, o come dici tu, un flusso di byte . Ancora più in alto si inizia a interpretare i dati grezzi. I byte possono essere interpretati come testo in molti modi (codifiche). Anche numeri interi (big o little endian). Puoi anche andare più in alto. Hai un file zip. Quel file zip è il tuo backup di ieri. E così via. Il problema è che il livello esatto è spesso implicito e non chiarito, e questo può essere fonte di confusione.
nalply

Risposte:


52

I flussi di byte contengono, beh, byte. Suddiviso in quello che è in realtà, è composto da 8 bit composti da 1 e 0 secondi. Se rappresentasse un numero, sarebbe qualsiasi numero compreso tra 0 e 255 (il che, posso aggiungere, non è un caso perché i 4 numeri in un indirizzo IP siano sempre compresi tra 0 e 255). I flussi di byte sono in genere interfacce sofisticate intese a nascondere l'array di byte di base sottostante utilizzato per contenere un buffer circolare (si riempie il buffer e si attende che qualcuno lo svuoti, a quel punto semplicemente riempie nuovamente il buffer).

Che diamine rappresenta? Bene, potrebbe rappresentare un file di testo, o un'immagine o un flusso video live. Ciò che è dipende interamente dal contesto di chi lo sta leggendo. La rappresentazione esadecimale è un altro modo di dire la stessa cosa, sebbene a volte sia più conveniente gestire i byte in termini della loro rappresentazione esadecimale piuttosto che i numeri, tuttavia è la stessa cosa.

Quando ti riferisci a dati grezzi, di solito ti riferisci a dati byte. I dati arrivano senza un tag che dice "I am a image file!" Di solito ti occupi solo di dati grezzi quando non ti interessa davvero ciò che i dati rappresentano nel complesso. Ad esempio, se volessi convertire un'immagine nella sua versione in bianco e nero, potrei dire di leggere i dati grezzi di un'immagine e per ogni 3 byte letto (che sarebbe effettivamente la rappresentazione del colore rosso, la rappresentazione del colore verde e la rappresentazione di colore blu), aggiungi il valore numerico e dividi per 3, quindi scrivi quel valore 3 volte. In sostanza quello che farei è calcolare la media dei valori rosso, verde e blu di un pixel e ricavarne un pixel equivalente grigio. Tuttavia, quando si parla di eseguire operazioni su dati a livello di "byte per byte", non si '

O forse si desidera salvare un file in un database, ma richiede di inserire i suoi "dati non elaborati" in un tipo di dati BLOB. Questo significa semplicemente convertire i dati di un file in un array di byte di grandi dimensioni che il database può comprendere e gestire. Scoprirai che quando recupererai quel valore dal database, sarà semplicemente un array di byte di grandi dimensioni come inizialmente fornito al database. Se quei dati erano un file, tu, il programmatore, devi reinterpretare quei dati di byte come se stessi leggendo un file alla volta.

Se qualcuno ti chiedesse di "invertire i dati a 4 byte", assumerei che si riferisca all'interpretazione big-endian vs little-endian dei numeri, che scrive numeri che iniziano con il byte più o meno significativo. Non importa se un numero è rappresentato come big-endian o little-endian, solo che tutti i sistemi che leggono il numero lo interpretano in modo coerente.

Questo non vuol dire che la rappresentazione numerica effettiva (o la rappresentazione esadecimale per quella materia) sia cambiata, semplicemente che l'ordine in cui questi 4 byte formano un numero dovrebbe essere invertito. Quindi supponiamo di avere 0x01, 0x02, 0x03 e 0x04. Per invertire questi, avresti invece 0x04, 0x03, 0x02, 0x01. Il sistema dovrebbe presumibilmente leggere questi 4 byte nell'ordine inverso e poiché lo hai già invertito, il valore viene interpretato come lo stesso di quello previsto nei dati non elaborati.

Spero che questo lo spieghi!


Va tutto bene ..! Potete per favore elaborare la risposta rispondendo a "dati grezzi"?
user2720323

@ user2720323 Ok, modificato per spiegare meglio i "dati non elaborati". :)
Neil,

Una cosa da tenere a mente ... tutti i dati sono semplicemente una raccolta di byte. Il significato di questi byte è definito da una sorta di metadati (estensione del file, campo del database, ecc.). Un file di immagine può essere interpretato come un file ASCII e viceversa. Il testo o l'immagine potrebbero non avere senso, ma è ancora possibile. (Derp ... avrei dovuto leggere le prossime risposte)
Dave Nay,

2
@kevincline Prova ad apprezzare il fatto che sto cercando di trasmettere un'idea. La mia priorità non è scrivere un algoritmo accurato. Se volessi essere più preciso, peseresti i valori rosso verde e blu in base a ciò che l'occhio umano può percepire.
Neil,

18

Un byte è semplicemente un'unità di informazioni: può essere qualsiasi cosa. Un byte di per sé non significa nulla, devi attribuirgli un significato.

Quindi, per espanderci -

Contiene byte (dati esadecimali) o dati binari o solo lettere inglesi?

I dati esadecimali sono gli stessi dei dati binari. È solo un modo diverso di visualizzare i dati. Ad esempio, 0x41 = 0b01000001 = 'A' = 65 (decimale). Le lettere inglesi sarebbero solo un sottoinsieme di ciò.

Se qualcuno mi chiedesse di "invertire i dati a 4 byte", allora cosa dovrei supporre che i dati siano codice esadecimale o codice binario?

Dato che hex è solo una rappresentazione dei dati, non importa come ci pensi. Se si dispone di dati di 0x65 0x66 0x67 0x68, per invertirlo si otterrebbe 0x68 0x67 0x66 0x65. Se stavi guardando questi dati in termini di personaggi, avresti originariamente A B C D, ma ora hai D C B A.

Torna a un flusso di byte: è solo una sequenza di dati. Devi sapere cosa rappresentano i dati per poterli utilizzare. Se stiamo leggendo un file di testo, il flusso di byte che otterresti quando stai leggendo il file sarebbe solo caratteri di qualche tipo. Un file eseguibile avrebbe un sacco di caratteri non stampabili in esso, motivo per cui sarebbe chiamato un file binario . Chiaramente, è possibile aprire un eseguibile in un editor di testo, ma non fa nulla di utile.


1
+1 ma l'enfasi sul binario nel bit lat sembra fuori luogo. I "dati binari" spesso contengono caratteri non stampabili, ma si chiamano "binari" perché sono composti da cifre binarie, non perché contengono caratteri non stampabili. Comprendo che stai usando "binario" in opposizione a dati "testuali" stampabili, ma penso che questo possa confondere ulteriormente il PO.
Caleb,

Ho una domanda relativa all'inversione. Se ho un numero intero (32 bit) 325487 in un file come posso invertire questo numero intero a 4 byte? allo stesso modo ho una parola ("hai come stai"), come invertire questa stringa assumendo ogni carattere come un byte.
user2720323

@ user2720323 int reverseX = ((x & 0xFF000000) >> 24) + ((x & 0x00FF0000) >> 8) + ((x & 0x0000FF00) << 8) + ((x & 0x000000FF) << 24); Questo prende letteralmente ogni byte, lo sposta nella giusta posizione e si combina con gli altri.
Neil,

2

Un flusso di byte è una sequenza ordinata di byte. C'è un primo byte, che non ha un predecessore. Il suo successore è il secondo byte e così via. Al giorno d'oggi, un byte è ampiamente compreso per essere composto da otto bit. Se vogliamo essere più precisi, usiamo il termine flusso di ottetti e ottetto . Esistono ancora computer con byte che non sono larghi otto bit.

L'esadecimale è un modo di scrivere numeri e funge da rappresentazione stampata per i dati binari. L'esadecimale è in realtà un testo. Ad esempio, il valore esadecimale FEpotrebbe rappresentare un byte: i bit 11111110che hanno il valore decimale 255. Tuttavia, in FErealtà è una stringa di caratteri composta da caratteri Fe Eche richiede due byte nel set di caratteri US-ASCII o ISO-646! Questi due byte sono ciò che FE è e il singolo byte con valore 254 è ciò che FE rappresenta , come notazione stampata.

Se un canale di comunicazione, un handle di file o qualche dispositivo simile viene descritto come portante un flusso di byte e non vengono fornite altre informazioni, quasi sicuramente non significa che i byte siano rappresentati come testo esadecimale, quindi ogni byte astratto nel flusso richiede due byte fisici.

E i dati grezzi significano semplicemente bit che non sono interpretati per avere una struttura al di là del solo "array di bit". I dati grezzi di solito hanno una struttura e rappresentano qualcosa, ma quando li guardiamo come dati grezzi, o stiamo ignorando l'interpretazione per il momento (ad esempio, stiamo guardando la rappresentazione grezza di un tipo di dati per verificarne la correttezza al dettaglio a livello di bit) o ​​l'interpretazione non è disponibile (disponiamo di alcuni dati, ma non comprendiamo la struttura dei dati e ciò che rappresentano).


Il PDP-10 aveva istruzioni per gestire byte di dimensioni variabili. Il più comune era ASCII a sette bit, seguito da caratteri a sei bit.
Kevin Cline,

0

Un byte è 8 bit. Un bit è 0 o 1. I "dati non elaborati" sono solo un flusso di un byte dopo l'altro. Un flusso di byte può provenire da un file, una connessione di rete, un oggetto serializzato, un generatore di numeri casuali, ecc.

  • Esistono diversi modi per visualizzare un byte: binario (01110110), hex = esadecimale (7C), ottale (0271) o decimale (215). In tutti i casi, il valore massimo è 255 (base 10).

  • A volte i byte vengono assegnati ai caratteri, come ascii. Digita "ascii" su una riga di comando unix e otterrai una grande tabella che mappa i valori dei byte 0-255 o (esadecimale 0-FF) sul carattere associato. Ad esempio, lo spazio è x20 e "A" è x40. Si noti che alcuni valori di byte vengono mappati per controllare i caratteri e non sono stampabili. Ma i byte stessi non sono personaggi - sono solo un insieme di bit. Un numero.

  • "invertire 4 byte" sarebbe prendere alcuni byte 123 42 231 0 e invertire l'ordine - 0 231 42 123. Applicato a un byte steam, probabilmente avrei letto 4 byte, invertito, letto i 4 byte successivi, ecc. .

(A proposito di questo problema è rilevante, perché se si desidera rappresentare un numero maggiore di 255 come byte, è necessario utilizzare più di un byte. Ma la domanda è: il byte "più grande" viene prima o per ultimo? big endian o little endian - cerca quelli per ulteriori informazioni sul perché è utile mescolare i byte in un flusso di byte non elaborato.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.