Cosè in realtà un flusso di byte?

Qualcuno può spiegarmi quale flusso di byte contiene effettivamente? Contiene byte (dati esadecimali) o dati binari o solo lettere inglesi? Sono anche confuso sul termine “dati grezzi”. Se qualcuno mi ha chiesto di “invertire i dati a 4 byte”, cosa dovrei presumere che i dati siano codice esadecimale o codice binario?

Commenti

  • I miei due centesimi non sono una risposta degna (e ce ne sono già di buoni di seguito), ma voglio solo fornire collegamenti a questi 2 articoli che probabilmente forniranno una buona panoramica su come ” dati grezzi ” viene interpretato per significare effettivamente qualcosa (non ‘ significa nulla a meno che tu non sappia cosa dovrebbe rappresentare e come è codificato / stored) betterexplained.com/articles/… joelonsoftware. com / articoli / Unicode.html
  • Penso che java abbia creato byte per evitare di utilizzare il carattere di c / c ++ ‘ per cose che possono ‘ da intendere come un carattere. char è stato utilizzato molto in c / c ++ perché la dimensione di char è 1 byte. Anche i dispositivi in unix sono dispositivi a blocchi e a caratteri. Se leggi da dispositivi char, ottieni un flusso di caratteri / byte non firmati.
  • Il flusso di byte è ambiguo. Il flusso di Octet non lo è.
  • I dati possono essere interpretati su molti livelli. In fondo è ‘ solo una serie di livelli elettrici on-off. Un po più in alto ‘ è un pezzo di byte, o come dici tu, un flusso di byte . Ancora più in alto inizi 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 salire 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ò creare confusione.

Risposta

I flussi di byte contengono, beh, byte. Suddiviso in quello che è in realtà, sono 8 bit composti da 1 e 0. Se rappresentasse un numero, sarebbe un numero qualsiasi da 0 a 255 (il che, aggiungo, non è un caso perché i 4 numeri in un indirizzo IP vanno sempre da 0 a 255). I flussi di byte sono solitamente interfacce sofisticate pensate per nascondere larray di byte di base sottostante usato per contenere un buffer circolare (riempi il buffer e aspetti che qualcuno lo svuoti, momento in cui riempie semplicemente il buffer ancora).

Cosa diavolo rappresenta? Bene, potrebbe rappresentare un file di testo, unimmagine o un flusso video in diretta. Ciò che è dipende interamente dal contesto di chi lo legge. La rappresentazione esadecimale è un altro modo per dire la stessa cosa, anche se a volte è più conveniente gestire i byte in termini di rappresentazione esadecimale piuttosto che numeri, tuttavia è la stessa cosa.

Quando “ti riferisci a dati grezzi, di solito ti riferisci a dati byte. I dati vengono forniti senza un tag che dice” Sono un file immagine! “Di solito ti occupi solo di dati grezzi quando non lo fai” Mi interessa davvero cosa rappresentano i dati nel complesso. Ad esempio, se volessi convertire unimmagine nella sua versione in bianco e nero, potrei dire di leggere i dati grezzi di unimmagine e per ogni 3 byte letti (che in realtà sarebbe la rappresentazione del colore rosso, la rappresentazione del colore verde e rappresentazione del colore blu), aggiungi il suo valore numerico e dividi per 3, quindi scrivi quel valore 3 volte. In sostanza quello che farei è fare la media dei valori di rosso, verde e blu di un pixel e creare il suo pixel grigio equivalente da quello Tuttavia, quando parli di eseguire operazioni sui dati al livello di “byte per byte”, non ti interessa veramente il quadro generale, per così dire.

Oppure, forse desideri salvare un file in un database, ma ti chiede di inserire i suoi “dati grezzi” in un tipo di dati blob. Ciò significa semplicemente convertire i dati di un file in un ampio array di byte che il database può comprendere e gestire. Scoprirai che quando recuperi quel valore dal database, sarà semplicemente un grande array di byte come inizialmente fornito al database per cominciare. Se quei dati erano un file, allora tu, il programmatore, devi reinterpretare quel byte dati come se stessi leggendo un file un byte alla volta.

Se qualcuno ti chiedesse di “invertire i dati a 4 byte”, presumo che si riferisca allinterpretazione dei numeri big-endian vs little-endian , 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 lordine in cui questi 4 byte formano un numero dovrebbe essere invertito. Quindi supponi di avere 0x01, 0x02, 0x03 e 0x04.Per invertirli, “dovresti avere 0x04, 0x03, 0x02, 0x01. Il sistema presumibilmente leggerebbe questi 4 byte in ordine inverso e, poiché lhai già invertito, il valore viene interpretato come uguale a quello che era previsto nei dati grezzi.

Spero che questo lo spieghi!

Commenti

  • Va tutto bene ..! Puoi elaborare la risposta reagendo a ” dati grezzi “?
  • @ user2720323 Va bene, modificato per spiegare meglio ” dati grezzi. ” 🙂
  • 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 file, campo database, ecc.). Un file di immagine può essere interpretato come un file ASCII e viceversa. Il testo o limmagine potrebbero essere privi di significato, ma è comunque possibile. (Derp … avrei dovuto leggere le prossime risposte)
  • @kevincline Per favore cerca di apprezzare il fatto che ‘ sto cercando di trasmettere unidea. La mia priorità non è ‘ scrivere un algoritmo accurato. Se vuoi essere più preciso, ‘ soppesare i valori rosso verde e blu in base a ciò che locchio umano può percepire.

Risposta

Un byte è semplicemente ununità di informazione – può essere qualsiasi cosa. Un byte di per sé “non significa nulla, devi attribuirgli una sorta di significato.

Quindi, per espandere questo –

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 questo.

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

Poiché hex è solo una rappresentazione dei dati, non importa come pensi a riguardo. Se disponi di dati di 0x65 0x66 0x67 0x68, per invertirli dovresti ottenere 0x68 0x67 0x66 0x65. Se guardassi questi dati in termini di caratteri, in origine avresti A B C D, ma ora hai D C B A.

Torna a un flusso di byte – esso “è solo una sequenza di dati. Devi sapere cosa rappresentano i dati per utilizzarli. Se leggiamo un file di testo, il flusso di byte che otterresti leggendo il file sarebbe costituito solo da caratteri di qualche tipo. Un file eseguibile avrebbe un mucchio di caratteri non stampabili, motivo per cui sarebbe chiamato file binario . Chiaramente, è possibile aprire un eseguibile in un editor di testo, ma non fa nulla di utile.

Commenti

  • +1 ma lenfasi su binario nel lat bit sembra fuori luogo. ” dati binari ” spesso contengono caratteri non stampabili, ma ‘ si chiamano ” binario ” perché ‘ è composto da cifre binarie, non perché contiene caratteri non stampabili . Mi risulta che ‘ stai utilizzando ” binario ” in opposizione a ” text ” data, ma penso che questo possa confondere ulteriormente lOP.
  • Ho una domanda riguardante linversione. Se ho un numero intero (32 bit) 325487 in un file, come posso invertire questo numero intero di 4 byte? allo stesso modo ho una parola (” hai come stai “), come invertire questa stringa assumendo ogni carattere come un byte.
  • @ 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.

Risposta

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

Lesadecimale è un modo di scrivere numeri e serve come rappresentazione stampata per i dati binari. Esadecimale è in realtà testo . Ad esempio, il valore esadecimale FE potrebbe rappresentare un byte: i bit 11111110 che hanno il valore decimale 255.Tuttavia FE è in realtà una stringa di caratteri composta dai caratteri F e E, che 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 viene descritto un canale di comunicazione, un file handle o un dispositivo simile poiché trasporta un flusso di byte e non vengono fornite altre informazioni, quasi certamente non significa che i byte sono rappresentati come testo esadecimale , in modo che ogni byte astratto nel flusso richieda due byte fisici.

E dati grezzi significa semplicemente bit che non sono interpretati per avere alcuna struttura al di là del semplice “array di bit”. I dati grezzi di solito hanno una struttura e rappresentano qualcosa, ma quando li guardiamo come dati grezzi, per il momento stiamo ignorando linterpretazione (ad esempio, stiamo guardando la rappresentazione grezza di un tipo di dati per verificarne la correttezza al dettaglio a livello di bit), oppure linterpretazione non è disponibile (abbiamo alcuni dati, ma non comprendiamo la struttura dei dati e cosa rappresentano).

Commenti

  • Il PDP-10 aveva istruzioni per gestire byte di dimensione variabile. Il più comune era ASCII a sette bit, seguito da caratteri a sei bit.

Risposta

Un byte è 8 bit. Un bit è 0 o 1. I “dati grezzi” sono solo un flusso di un byte dopo laltro. 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 (0-FF hex) al carattere associato. Ad esempio, lo spazio è x20 e “A” è x40 Notare che alcuni valori di byte mappano per controllare i caratteri e non sono stampabili. Ma i byte in sé non sono “t caratteri”, sono solo un insieme di bit. Un numero.

  • “invertire 4 byte” significherebbe prendere alcuni byte 123 42 231 0 e capovolgere lordine – 0 231 42 123. Applicato a un byte steam, I “d probabilmente leggere 4 byte, invertirli, leggere i successivi 4 byte, ecc.

(A proposito, questo problema è rilevante, perché se vuoi rappresentare un numero maggiore di 255 come byes, è necessario utilizzare più di un byte. Ma poi la domanda è: il byte “più grande” viene per primo o per ultimo? Quello “si chiama big endian o little endian – cercali per ulteriori informazioni sul motivo è utile mescolare i byte in un flusso di byte grezzo.)

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *