Yritän kirjoittaa vb.netillä Minecraftiin serveriä ja nyt päädyin umpikujaan. Tiedosto (kartta) alkaa pakkaamattomalla headerilla, jossa lukee pakattujen osien sijainti ja pituus tiedostossa. Tarkoitus olisi saada luettua zlib:illä pakatut osat, kun tiedän, kuinka paljon pakatun osan pituus on pakattuna. Täydellinen formaatti löytyy täältä.
Eli mikä on ongelmana?
Se, että miten sitä zlibbiä käytetän tiedoston keskeltä (tai ylipäätänsä tiedoston) lukemiseen. Toivoisin, että joku antaa ihan valmiin koodin. Itselläni kun ei ole yhtään kokemusta zlibin käytöstä. Ihan oppistarkoituksessa tätä teen.
Olitko ajatellut käyttää zlib:in dll suoraan vai jotain valmiiksi paketoitua versiota, kuten zlib.net ? http://www.topshareware.com/ZLIB.NET-download-46526.htm
Jotenkin näin:
imports zlib Dim rawReader As New StreamReader(GetFileName()) Dim reader As Stream = rawReader.BaseStream Dim zstream As New ZInputStream(reader) zstream.ReadByte()
Veikkaisin, että kirjasto on tämä http://www.componentace.com/zlib_.NET.htm
Se tuli yhden valmiin serverin mukana, jota kopioin harjoitus mielessä. Valitettavasti serveri vain ei ole yhteensopiva uuden formaatin kanssa.
Edit. Näköjään viesti muuttui. Itselleni on ihan sama, käytänkö suoraan zlibiä vai jotain .net-kirjastoa.
No tuossa esimerkissäsihän voisit sanoa
reader.Seek(amount, System.IO.SeekOrigin.Begin)
ennen kuin annat readerin ZInputStreamille. Ja amount on siis muuttuja, jossa tieto millä etäisyydellä alusta zlib-pakattu data alkaa.
Loogisesti tuo ZInputStream sitten lukisi siitä eteenpäin
Hyvä, kiitos. Mitenkäs saan sen vielä lopettamaan oikeassa kohdassa? Tämä koodi taitaa toimia oikein (?):
reader.Seek(offset + 5, SeekOrigin.Begin) Dim zstream As New ZInputStream(reader) Dim bytes As New List(Of Byte) While zstream.BaseStream.Position < offset + length Dim buffer(0) As Byte zstream.Read(buffer, 0, 1) bytes.AddRange(buffer) End While
Voisit varmaankin lukea ensin pakatun datan Byte-taulukkoon ja luoda siitä sitten MemoryStreamin zlibiä varten.
Aihe on jo aika vanha, joten et voi enää vastata siihen.