09. april 2001 - 10:10Der 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 ...
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
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 ..)
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.
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 ..
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\"
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.
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.
Synes godt om
Ny brugerNybegynder
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.