Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: [VB.NET] Tiedon välitys RAM -muistissa

Sivun loppuun

ErroR++ [26.08.2011 09:47:24]

#

Moi taas!!
ohjelman pitäis välittää tieto RAMissa ohjelmalta toiseen. Ajattelin jotain tällästä:

Function lahetaTieto(ByVal tieto() As Byte, ByVal id As Integer, ByVal vastaanotin_id As Integer) As Integer
       Dim ctieto As Byte() = XORCrypt(tieto, vastaanotin_id)
       System.IO.File.Create(Application.StartupPath & "\file", tieto.Length, IO.FileOptions.DeleteOnClose)
       FileOpen(id, Application.StartupPath & "\file", OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.Shared)
       Print(id, ctieto)
       Return 0
   End Function
   Function XORCrypt(ByVal CryptData() As Byte, ByVal CryptKey As Byte) As Byte()

       Dim XOR1 As Byte 'se merkki tosta jonosta
       Dim XOR2 As Byte 'avaimen maski äkstai
       Dim RetVal() As Byte = Nothing  'lopputulos
       For ptr = 1 To CryptData.Length  'käydään kaikki merkit läpi
           XOR1 = CryptData(ptr) 'napataan se merkki joka cryptataan
           XOR2 = CryptKey  'maski vai mikskä sitä nyt kutsutaan
           RetVal(ptr) = XOR1 Xor XOR2 'cryptataan
       Next
       XORCrypt = RetVal 'valmista

   End Function
   Function TextTobyte(ByVal str As String) As Byte()
       'muuttaa byte matriisin tekstiksi
       Dim i As Long
       Dim mat(str.Length - 1) As Byte
       For i = 0 To str.Length - 1
           mat(i) = Asc(str.Chars(i))
       Next
       TextTobyte = mat
   End Function
   Function vastaanotaTieto(ByVal id As Integer, ByVal vastaanotin_id As Integer) As Byte()
       Dim ctieto As Byte() = TextTobyte(InputString(id, CType(LOF(1), Integer)))
       Dim tieto As Byte() = XORCrypt(ctieto, vastaanotin_id)
       vastaanotaTieto = tieto
       FileClose(id)
   End Function

groovyb [27.08.2011 11:44:58]

#

Eikös se tässä mene kovalevyn kautta, eikä ramin?

The Alchemist [27.08.2011 12:31:31]

#

Tarkoitus olikin, että joku kirjoittaisi hänelle tuon pohjalta uuden koodin, joka ei käytä levyä.

ErroR++ [27.08.2011 14:12:06]

#

groovyb kirjoitti:

Eikös se tässä mene kovalevyn kautta, eikä ramin?

Ei sen tuossa kovalevyn kautta pitäisi mennä. Siinähän oli:

Function lahetaTieto(ByVal tieto() As Byte, ByVal id As Integer, ByVal vastaanotin_id As Integer) As Integer
       Dim ctieto As Byte() = XORCrypt(tieto, vastaanotin_id)
       System.IO.File.Create(Application.StartupPath & "\file", tieto.Length, IO.FileOptions.DeleteOnClose) 'laitetaan määreeksi "deleteOnClose", niin saadaan se pois kun tieo on välitetty
       FileOpen(id, Application.StartupPath & "\file", OpenMode.Binary, OpenAccess.ReadWrite, OpenShare.Shared) 'avataan tiedosto "Shared":isti niin kaikki muut prosessit voi käyttää tietoa(joka on cryptattu!)
       Print(id, ctieto) 'tulostetaan tieto, mutta ei suljeta tiedostoa, jnka kaikki sisältö on nyt ram -muistissa
       Return 0 'ei virheitä
   End Function

Function vastaanotaTieto(ByVal id As Integer, ByVal vastaanotin_id As Integer) As Byte()
       Dim ctieto As Byte() = TextTobyte(InputString(id, CType(LOF(1), Integer))) 'otetaan tieto alteen RAMista, koska tiedostoa ei ole vielä suljettu
       Dim tieto As Byte() = XORCrypt(ctieto, vastaanotin_id) 'cryptataan takaisin toimivaksi(ko) tiedoksi
       vastaanotaTieto = tieto 'tieto vastaanotettu
       FileClose(id) 'Vasta nyt suljetaan tiedosto, ja tiedot tallentuvat levylle, mutta koska rivillä 4 oli määre "DeleteOnClose" tälle tidostolle niin se hajotetaan.
   End Function

Tieto on ram -muistissa koska Windows käyttää tiedostokahvoja. Eli kun tiedosto avataan, sen sisältö kopioidaan paljon nopeamaan RAMiin. Sitten kun tiedostoon kirjoitetaan, kirjoitetaankin RAMiin eli tiedoston tiedostkahvaan. Kun tiadosto suljetaan niin tiedostokahvan sisältö kirjoitetaan kiintolevylle.
Ja koska tiedoston määre oli "DeleteOnClose", niin se tuhotaan.

-tossu- [27.08.2011 14:52:11]

#

Mistä olet saanut päähäsi, ettei Windows kirjoita tiedostoa levylle ennen sulkemista? Pienillä datamäärillä Windows saattaa pitää tiedoston kokonaan levyvälimuistissa, mutta isomilla määrillä sen on pakko kirjoittaa data jossain vaiheessa levylle. USB-muisteilla kirjoitusvälimuisti ei taida olla oletuksena päällä, eli data kirjoitetaan levylle välittömästi.

Metabolix [27.08.2011 14:54:52]

#

Olet käsittänyt jotain (kaiken?) pahasti väärin. Tiedostokahvoilla ei ole mitään tekemistä sen kanssa, missä tiedoston sisältö on. Se, että tiedostoon tallennettava tieto "pysyy RAMissa", tarkoittaa, että tieto on ohjelman omassa välimuistissa odottamassa, että tietoa tulee lisää, jolloin saadaan kirjoitettua tehokkaammin iso määrä kerralla, tai että tiedosto suljetaan, jolloin on pakko kirjoittaa. Toisin sanoen tieto ei koskaan pääse sen vastaanottavan ohjelman puolelle, vaan siellä näkyy tyhjä tiedosto, koska mitään ei ole kirjoitettu tiedostoon asti.

Grez [27.08.2011 15:00:33]

#

Mielestäni muutenkin lievän nurinkurista kirjoittaa dataa levylle ja toivoa että se ei ehdi välimuistista fyysiselle levylle asti, jos on tarkoitus siirtää dataa RAMissa. Mikset käytä vaikka nimettyjä putkia, remotingia tai tcp:tä, jolloin tieto oikeasti liikkuu muistissa?

ErroR++ [28.08.2011 11:07:19]

#

No, olenhan lukenut vanhoja kirjoja ):
Kirja, mistä nuo luin, on kuitenkin kirjoitettu vuonna 2000.
Ehkäpä tekniikka on muuttunut...

Metabolix [28.08.2011 12:46:39]

#

Tekniikka ei ole tietääkseni tässä asiassa muuttunut. Tiedosto on Windowsissa aina ollut tiedosto. Käytä putkia tai verkkoyhteyttä sen mukaan, onko mahdollisesti joskus tarpeen laittaa ohjelmat eri koneille.

Grez [28.08.2011 14:23:16]

#

ErroR++ kirjoitti:

No, olenhan lukenut vanhoja kirjoja ):
Kirja, mistä nuo luin, on kuitenkin kirjoitettu vuonna 2000.
Ehkäpä tekniikka on muuttunut...

Ei kannata lukea noin huonoja kirjoja. Jos siellä oikeasti lukee noin kuin väität, niin kirjan kirjoittaja on keksinyt juttuja omasta päästään, eikä ole edes vaivautunut miettimään voisiko se oma keksintö edes teoriassa toimia. Ei ehkä kannata luottaa muuhunkaan mitä siellä lukee.

ErroR++ [28.08.2011 16:49:57]

#

Minä olen keksinyt tuon koodin omasta päästä. Kirja on assemblyn opiskeluun soveltuva kirja. Ja siinä kirjassa puhutaan DOSista.

No nyt kun selvisi että olen ymmärtänyt jotain väärin niin haluaisin tietysti vastauksen alkuperäiseen kysymykseen.

Grez [28.08.2011 16:55:49]

#

No eipä ne dossissakaan ajattelemallasi tavalla toimineet.

ErroR++ kirjoitti:

haluaisin tietysti vastauksen alkuperäiseen kysymykseen.

Grez kirjoitti:

Mikset käytä vaikka nimettyjä putkia, remotingia tai tcp:tä, jolloin tieto oikeasti liikkuu muistissa?

Metabolix kirjoitti:

Käytä putkia tai verkkoyhteyttä sen mukaan, onko mahdollisesti joskus tarpeen laittaa ohjelmat eri koneille.

ErroR++ [28.08.2011 17:31:28]

#

Kiitos!

tepokas [28.08.2011 18:32:40]

#

Kokeile googlata "memory-mapped file".

MMF and VB

Grez [28.08.2011 19:02:46]

#

Jos olisi tarve nimenomaan tiedosto-tyyliseen käyttöön, niin sitten tuo MMF on näppärä ratkaisu. Mutta alkuperäisen esimerkkikoodin semantiikan mukaan oli tarve lähettää ja vastaanottaa sanoma (tieto), jolloin mielestäni aiemmin ehdotetut sopii tarkoitukseen paremmin.

ErroR++ [28.08.2011 21:12:33]

#

Tuo MMF todellakin on näpärä ratkaisu!!! Kiitos kaikille!!!


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta