Riempimento dati per supporto hardware diverso?

2

Alcuni componenti hardware non sono in grado di leggere i dati non allineati. Ad esempio, le immagini Bitmap sono allineate a 4 byte dall'intestazione e con ciascuna linea di scansione per mantenere l'indipendenza del dispositivo.

Ad esempio, puoi causare un errore di allineamento accedendo alla memoria non allineata come nell'esempio nella wiki. Tuttavia, questo è vero per i file?

Se provassi a leggere i dati da un file binario (come Bitmap) con un indice non allineato, ciò causerebbe un errore di allineamento su un determinato hardware? La mia ipotesi è che lo farà perché Bitmap salvaguarda da questo, tuttavia è del tutto necessario prendere questa precauzione se voglio fare un file binario o anche un pezzo di codice per caricare quel dispositivo di file indipendente?

    
posta FatalSleep 16.03.2015 - 08:46
fonte

3 risposte

7

Some hardware cannot read non-aligned data.

True.

For example Bitmap images are aligned to 4-bytes from the header and with each scan line in order to maintain device independence.

Ho un numero di punti da fare su questa frase:

  • L'organizzazione interna dei file bitmap non è un esempio di hardware che non è in grado di leggere i dati non allineati.

  • La parola "dispositivo" nel termine "indipendenza dispositivo" per bitmap si riferisce al display, non alla CPU. L'allineamento dei dati è un problema che la CPU deve affrontare.

  • Il motivo di questa organizzazione è non al fine di mantenere l'indipendenza del dispositivo. File Windows .BMP (suppongo che ciò che intendi per "immagini bitmap") siano allineati a 4 byte perché l'architettura x86 funzionerà al meglio quando legge i dati allineati. Può, tuttavia, leggere i dati non allineati. Semplicemente non funzionerà più velocemente.

For example you can cause an alignment fault by accessing unaligned memory as per the example in the wiki. However, does this actually hold true for files?

Sì e no. Ovviamente, una CPU non potrebbe importare di meno se un certo file che si trova sul disco è o non è allineato. Ma per fare in modo che il file sia di qualche utilità, sarà necessario caricarlo in memoria ad un certo punto, giusto? Ecco quando è utile l'allineamento corretto.

If I tried to read data from a binary file(like Bitmaps) at an non-aligned index will this cause an alignment fault on certain hardware?

Sì, lo sarà. Ma non su qualsiasi x86 o x64. Su un x86 e amp; x64 otterrai prestazioni non ottimali.

My guess is that it will because Bitmaps safeguard against this,

Prendere le organizzazioni in formato file come suggerimenti sui potenziali comportamenti della CPU è fuorviante come prendere i colori della squadra di calcio come suggerimenti sulle decisioni di investimento in borsa.

however is it entirely necessary to take this precaution if I want to make a binary file or even a piece of code to load that file device independent?

Anche in questo caso, riguardante "Device Independent",

Suppongocheper"dispositivo indipendente" intendi "architettura hardware indipendente" (che in realtà significa "CPU indipendente"), quindi la risposta qui è che dipende da quanto tu vuoi essere indipendente.

  • Se vuoi essere completamente indipendente, non puoi assolutamente utilizzare i file binari.

  • Se vuoi essere moderatamente indipendente, procedi con il file binario, ma assicurati di utilizzare un allineamento di 4 o meglio ancora di 8.

  • Se vuoi essere solo ragionevolmente indipendente, ignora l'allineamento. È solo un file. Se qualcuno deve leggerlo su qualche hardware strano, può leggerlo byte per byte.

risposta data 16.03.2015 - 12:37
fonte
1

If I tried to read data from a binary file(like Bitmaps) at an non-aligned index will this cause an alignment fault on certain hardware?

Sì, lo sarà. Questo dipende dall'hardware, alcuni sono più e alcuni meno tolleranti, ma possono causare guasti. In particolare, in C la lettura da un indirizzo impropriamente allineato è un comportamento indefinito, il che significa che qualsiasi cosa (crash, corruzione dei dati, niente) può accadere.

L'unico modo sicuro e indipendente dalla piattaforma è leggere sempre byte per byte. Se ciò è troppo inefficiente, avrai bisogno di una soluzione dipendente dalla piattaforma, che possa quindi eseguire solo l'allineamento realmente necessario per questa piattaforma.

    
risposta data 16.03.2015 - 09:40
fonte
1

Il codice che legge un file deve solo rispettare le regole del file. Un file zip spesso contiene dati che non sono nemmeno allineati a byte (in pratica è così che il formato raggiunge la compressione - usa meno di 8 bit per i byte comuni nell'input). Il codice di decompressione deve quindi gestire i singoli bit.

Per bitmap, è spesso più semplice. Avere strutture allineate a 4 byte significa che è possibile mappare la memoria del file e quindi accedere in modo sicuro ai campi dell'intestazione come numeri interi. Se non fossero allineati, avresti bisogno di copiare i 4 byte non allineati in 4 byte allineati. Questo può spesso essere fatto in modo trasparente, ad es. di fread . Copia i byte dal suo buffer interno all'indirizzo specificato.

    
risposta data 16.03.2015 - 17:24
fonte

Leggi altre domande sui tag