Toon posts:

[VB.NET] Wegschrijven integer/long weer inlezen...

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

ik heb een bestand, wat een BMP file is alleen zonder de header, die meot ik zelf nog toevoegen. Maar het gaat verkeerd...

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
        Dim bmpHeader As BITMAPFILEHEADER

        Dim fs2 As FileStream = New FileStream("d:\test3.bmp", FileMode.Create)
        Dim writer As BinaryWriter = New BinaryWrit

        'De BITMAPFILEHEADER STRUCTURE...
        'Dim bfType As Integer
        'Dim bfSize As Long
        'Dim bfReserved1 As Integer
        'Dim bfReserved2 As Integer
        'Dim bfOffBits As Long

        With bmpHeader
            .bfType = 19778
            .bfSize = bmp.Length   ' is iets van 20504 bytes 
            .bfReserved1 = 0
            .bfReserved2 = 0
            .bfOffBits = 1078
        End With
       ' bmp is een array van bytes wat de inhoud is van de file maar verder nu niet interessant


        'wegschrijven...
        writer.Write(bmpHeader.bfType)
        writer.Write(bmpHeader.bfSize)
        writer.Write(bmpHeader.bfReserved1)
        writer.Write(bmpHeader.bfReserved2)

        writer.Write(bmpHeader.bfOffBits)


goed dat is het wegschrijf stukje. dat doe ik dus. Theoretisch zou er dus in het bestand staan: 1977820504001078 ofzo met het juiste aantal posities aangezien de write functie het juiste aantal bytes doorschuift met de pointer...

dan het inlezen

code:
1
2
3
4
5
6
        bmpHeader.bfType = reader.ReadInt16()
        bmpHeader.bfSize = reader.ReadInt32()
        ' bmpHeader.bfSize = reader.ReadInt16()  **
        bmpHeader.bfReserved1 = reader.ReadInt16()
        bmpHeader.bfReserved2 = reader.ReadInt16()
        bmpHeader.bfOffBits = reader.ReadInt32()


Als ik dit doe heeft bfType de juiste waarde nl. 19778, maar de bfSize een heeeele grote waarde. Als ik nu van die 32 een 16 maak en de regel erna uncomment, dan heeft bfSize wel de juiste waarde... maar bfOffBits nog steeds niet...

schrijf ik dit verkeerd weg ofzo? echt heel vaag. Ik moet echt een header kunnen schrijven anders kun je die bmp niet bekijken...!

Verwijderd

Hmm, 2 mogelijkheden:
1. De ReadIntNN functie leest hexadecimaal
2. De ReadIntNN functie wil nulletjes.. dus 000000020504 oid

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het gaat om de datatypes die je wegschrijft. Je probeert een Int32 te lezen. Maar een long is volgens mij een Int64 dus dat zal denk wel je probleem zijn.

Ik weet niet of het hier mis gaat bij het wegschrijven of het inlezen. Maar je moet er ieder geval voor zorgen dat je voor een long bijvoorbeeld 64 bits schrijft en ook leest en voor een integer is het als het goed is 32 bits. Deze waardes weet ik bijna zeker maar als ik jou was zou ik het nog even na zoeken in de msdn

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • nIghtorius
  • Registratie: Juli 2002
  • Laatst online: 21-08 16:50

nIghtorius

Poef!

rwb schreef op 30 juli 2003 @ 18:59:
Het gaat om de datatypes die je wegschrijft. Je probeert een Int32 te lezen. Maar een long is volgens mij een Int64 dus dat zal denk wel je probleem zijn.

Ik weet niet of het hier mis gaat bij het wegschrijven of het inlezen. Maar je moet er ieder geval voor zorgen dat je voor een long bijvoorbeeld 64 bits schrijft en ook leest en voor een integer is het als het goed is 32 bits. Deze waardes weet ik bijna zeker maar als ik jou was zou ik het nog even na zoeken in de msdn
long is zover ik nog steeds weet 4 byte groot (4 x 8 = 32 bits).

Ryzen 9 5900X @ 5.1Ghz | MPG B550 GAMING CARBON | 96GB DDR4-3200 | RTX 4070TI | 2TB + 1TB m.2 SSD | 3x 1TB HDD | 1x 2TB SATA SSD | 32" G3223Q (4K/144Hz)


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
nIghtorius schreef op 30 July 2003 @ 19:34:
[...]


long is zover ik nog steeds weet 4 byte groot (4 x 8 = 32 bits).
Ik zeg ook dat ik het niet zeker weet. Ik weet alleen wel zeker dat een int al 32 bits is. Want het bereik van een int is iets meer als 4 miljard. En dat is 2^32 dus ik ga er eigenlijk van uit dat een long 64 bits is.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
in .NET is een long een 64 bit integer:

https://fgheysels.github.io/


  • nIghtorius
  • Registratie: Juli 2002
  • Laatst online: 21-08 16:50

nIghtorius

Poef!

whoami schreef op 31 July 2003 @ 10:54:
in .NET is een long een 64 bit integer:
je gaat me toch niet vertellen dat microsoft weer eens schijt heeft aan de standaard grootte van integers?

de enigste type die in bits verhoogd mag worden is nog altijd het ''int" type. Omdat
deze afhankelijk is van het gebruikte compiler.

zo was int 16 bits bij 16 bit compilers
32 bits bij 32 bit compilers.

maar long was toendertijd altijd 32 bits. ook had je te maken met een 16 bits compiler. maar ik kan dit niet beämen met visualbasic.

ok.. de long in vb.net is 64 bits (een domme beslissing van microsoft). wat is dan het 32 bits variant? a.u.b. toch niet het "int" type?

edit:

integers en aantal bits in C++/Delphi/Pascal

code:
1
2
3
4
5
INT              <COMPILER afhankelijk>
SHORTINT   <8 bits>
SMALLINT <16 bits>
LONGINT    <32 bits>
INT64        <64 bits>

[ Voor 15% gewijzigd door nIghtorius op 31-07-2003 12:18 ]

Ryzen 9 5900X @ 5.1Ghz | MPG B550 GAMING CARBON | 96GB DDR4-3200 | RTX 4070TI | 2TB + 1TB m.2 SSD | 3x 1TB HDD | 1x 2TB SATA SSD | 32" G3223Q (4K/144Hz)


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Rechtsreeks uit de help van .Net:
Integer System.Int32 4 bytes
-2,147,483,648 through 2,147,483,647.

Long (long integer) System.Int64 8 bytes
-9,223,372,036,854,775,808 through 9,223,372,036,854,775,807.

Short System.Int16 2 bytes
-32,768 through 32,767.
Wel dus...
En daar heb je waarschijnlijk ook je probleem, insane...

My personal website


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

VB.NET maps the datatype "Short" to System.Int16, "Integer" to System.Int32
and "Long" to System.Int64. They are interchangeable. Likewise, C# maps
"int" to "System.Int32", etc...

Digitaal onderwijsmateriaal, leermateriaal voor hbo

Pagina: 1