Most recent comments
Jogging og blogging
Are, 9 måneder, 2 uker
Liveblogg nyttårsaften 2016
Are, 9 måneder, 2 uker
Reading in dark times
Are, 11 måneder, 1 uke
Moldejazz 2016
Camilla, 1 år, 2 måneder
Dørskilt
Karoline, 1 år, 3 måneder
Halifax
Tor, 1 år, 4 måneder
Sony Smartwatch 3 review
Tor, 1 år, 4 måneder
Numerikk, takk
Tor, 1 år, 4 måneder
Topp tur
Camilla, 1 år, 6 måneder
Tolkien reading day
Tor, 1 år, 7 måneder
50 book challenge
Camilla, 9 måneder, 3 uker
Five years ago
Tokyo
Tor
Controls
Register

Binærfiler

Egentlig er det litt misvisende å snakke om binærfiler som en spesiell ting, ettersom dette indikerer at det finnes andre typer filer. Alle filer på en datamaskin er lagret som binære data, og dermed er alle filer strengt tatt binærfiler. Likevel snakker man gjerne om tekstfiler og binærfiler som to forskjellige ting. Den praktiske forskjellen består i at man kan åpne en tekstfil i en editor (Finnes det et godt norsk ord for editor? Redigerer?) og lese det som står der, mens en binærfil vil bare se ut som støy. (Strengt tatt kan man ikke alltid lese det som står i en tekstfil, det kommer jo an på om man kan språket det er skrevet i, men poenget er at editoren vil kjenne det igjen som bokstaver og tegn.)

En tekstfil er, som nevnt, også en binærfil. Akkurat hvordan den funker kommer an på hvilken av irriterende mange konvensjoner (encodings) man har valgt, men grovt sett kan man si at hvis man for det meste holder seg til ukontroversielle bokstaver funker det på den måten at 1 byte, altså 8 bit, blir tolket som et tegn. 8 bit gir 28=256 mulige verdier, skjønt i praksis funker det ikke akkurat slik, men essensen er at én byte brukes til å kode ett tegn.

Dette funker fint for tekst, men ikke fullt så fint hvis man skal lagre tall. Grunnen er at det finnes bare 10 forskjellige siffer, minus, kanskje en e hvis man vil skrive veldig store eller veldig små tall, og kanskje mellomrom og linjeskift for å skille tall fra hverandre. Å bruke 1 byte på å kode hvert tall, komma, minus, e, mellomrom eller linjeskift, er å sløse med data, siden 1 byte kan kode 256 forskjellige verdier, mens ti siffer, minus, komma, e, mellomrom og linjeskift bare er 15 forskjellige muligheter. Hvis man bruker 4 bytes på å lagre et desimaltall i det som gjerne kalles singel presisjon, kan man lagre et tall med omtrent 7-8 siffer ganget med en tierpotens. Å lagre det samme med tekst kan fort ta 14 tegn, altså 14 bytes, så det samme tallet tar nesten fire ganger så mye plass som tekst. Av denne grunn (og sikkert andre, som har med effektive regneoperasjoner å gjøre) tyr man ofte til binærfiler for å lagre store mengder tall.

Å lagre tall i binærfiler er vel og bra, helt til man blir nødt til å lage et program for å lese dem. Da gjelder det å huske på hva man egentlig lagret. Har man for eksempel lagret ett tall, som 4 byte og på standard vis, er det veldig lettvint. Man kan for eksempel prøve seg på litt python:
# struct kan konvertere binær til flyttall
import struct
# Åpne en fil for lesning ('r') i byte-modus ('b')
datafile = open('filnavn', 'rb')
# Les 4 bytes og lagre dem i variabelen data
data = datafile.read(4)
# Konverter til flyttall ('f') og skriv ut resultatet
print struct.unpack('f', data)

Problemene oppstår hvis man prøver seg på avanserte ting, som å lagre en blanding av heltall, desimaltall (gjerne i både singel og dobbel presisjon), tekst og jeg vet ikke hva. Hvis man for eksempel åpner en binærfil og leser
11011011000011110100100101000000

er det umulig å vite hvordan dette er ment å tolkes, med mindre den som lagret filen har skrevet det ned et sted. Og nettopp det er bakgrunnen for at jeg skriver denne artikkelen. I forrige uke ble en kollega og jeg nødt til å prøve oss på å finne ut av en binærfil med kun utdatert dokumentasjon til hjelp, og selv om det har litt den samme følelsen av detektivarbeid som jeg nevnte i artikkelen om å lese digre tekstfiler er det egentlig mest irriterende.

I morgen: HDF5
Anja likes this
Category
Technology
Tags
programmering
data
binærfiler
Views
1253