Avatar billede amoelle Nybegynder
09. april 2001 - 10:10 Der er 10 kommentarer og
1 løsning

indlæs fra binær fil, der er skrevet af pascal appl.

Jeg står en en binærfil på 32 bytes, der er lavet af en pascal applikation.
De første 16 bytes skal læses som 8*2 bytes, og tolkes som 8 tal, - de sidste 16 bytes skal læses een for een og også tolkes som 16 tal.
Filen indeholder altså 8 tal i pascaltypen Word (unsigned 16-bit), og derefter 16 bytes, der hver skal tolkes som et tal (0-255)

Jeg har været igang med on-line hjælp, men synes at eksemplerne vedr binær indlæsning og konvertering ml datatyper er meget tyndt beskrevet. (VB5) Hvad er VB-typen Variant f.eks. god til ????

No\'en gode idéer ?

Alternativt, kan jeg skrive en pascal appl. der læser filen, og konverterer den til f.eks. komma eller tab- separeret format, hvorefter VB5 appl. kan læse den.... - men det er der ikke så meget sport i ...

på forhånd tak
Avatar billede tdaugaard Nybegynder
09. april 2001 - 10:26 #1
Følgende Sub læser filen og gemmer de første 8 tal som en 2-byte streng i Unsigned16Bit() arrayet.
De sidste 16 bytes gemmes i SingleBytes() arrayet som Byte (0-255)

Private Sub ReadPascalBinary()
    Dim Unsigned16Bit(7)    As String * 2
    Dim TempByte            As String * 1
    Dim SingleBytes(15)    As Byte

    Dim Index As Integer

    Open \"binærfil.bin\" For Binary As #1
        For Index = 0 To 7
            Get #1, , Unsigned16Bit(Index)
        Next
        For Index = 0 To 15
            Get #1, , TempByte
            SingleBytes(Index) = Asc(TempByte)
        Next
    Close #1
End Sub
Avatar billede tdaugaard Nybegynder
09. april 2001 - 10:27 #2
Jeg prøvede lige at udtænke hvordan man finder det Unsigned 16 bits tal ud fra de 2 bytes, men jeg kan sku ikke huske hvordan man behandler ASCII værdierne (om de skal ganges med hinanden eller hvad de skal ..)
Avatar billede amoelle Nybegynder
09. april 2001 - 10:35 #3
Jeg forstår ikke flg efklæring:
Dim Unsigned16Bit(7) as String *2

Du erklærer et array af længde 8  (til de 8 første tal) - OK, men \"String *2\" ???

Er en String altid 1 byte lang (nej vel ?) ?
Noget af det jeg netop manglede i on-line hjælp var en angivelse af, hvordang man erklærer en fixed-length String.

Ang. konverteringen af et 16-bits mønster til en talværdi, kan jeg slå det op i Pascal dokumentationen. Det er noget med radix osv...., men at komme dertil, hvor jeg har en række på 16 bits .... DET er problemet.
Avatar billede tdaugaard Nybegynder
09. april 2001 - 10:40 #4
amoelle:>
Dim Unsigned16Bit(7) as String * 2

et array med 8 elementer hvor hvert element ALTID indeholder 2 tegn (fixed length)

En streng er altid af variabel længde hvis du ikke skriver * n (n=tegn lang) efter As String.
En Variant som du spurgte om, den tilpasser sin datatype alt efter hvad du tildeler den.

Dim v As Variant

v = 125
\' v vil nu være af sub-datatypen Integer (mener jeg ! ellers Long)

v = \"Hejsa\"
\' v vil nu være af sub-datatypen String

v = 12.5
\' v vil nu være af sub-datatypen Single/Double (floating point)

Hvis du kan finde ud af hvordan man finder \"tallet\" ud fra de 2 bytes skal jeg da gerne prøve at lave det ..
Avatar billede tdaugaard Nybegynder
09. april 2001 - 10:44 #5
amoelle:> En ting til, når man læser en fil vha. For Binary .. så SKAL man bruge Fixed Length strenge, eller variabler af en eller anden tal type. Ellers får man ikke det man \"vil have\"
Avatar billede amoelle Nybegynder
09. april 2001 - 11:28 #6
Jeg vender lige tilbage imorgen... du får de første 30 point nu  ;-)
Avatar billede tdaugaard Nybegynder
09. april 2001 - 11:30 #7
ehm .. er der double-up eller ? ;o)
Avatar billede amoelle Nybegynder
09. april 2001 - 11:37 #8
ja- i første omgang, skal jeg lige finde ud af faktisk at give dig de 30 point for VB-eksemplet.

Men jeg vil lige checke pascal dokumentationen derhjemme på den støvede hylde.
Unsigned 16-bit skulle være ganske nem ( ingen fortegn, ingen decimaler, ingen eksponent eller fraction del...), problemet er bare at 16-bit tallet \'1A00\' giver 6656, og ikke 210 ( =16-bittallet  \'00B2\')- så Pascal må bruge en eller anden bizar bit-konvertering.

Avatar billede amoelle Nybegynder
09. april 2001 - 11:39 #9
Fantastisk brugergrænseflade  ;-)
Jeg kan se, at du har fået alle 60 allerede...

No problem, - måske KAN man i virkeligheden ikke fordele de udlovede points ?

Tak for hjælpen
Avatar billede tdaugaard Nybegynder
09. april 2001 - 11:42 #10
amoelle:> eller også gemmer Pascal tal værdier i et andet format end normalt :-(
Avatar billede amoelle Nybegynder
09. april 2001 - 11:45 #11
Ja, det er lavet i Turbo Pascal 6.0 - dengang ingen havde 32-bits maskiner, og man skulle spare på hver eneste byte - det begrunder også den hårdt sammenpressede data pakning.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester