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 FunctionEikös se tässä mene kovalevyn kautta, eikä ramin?
Tarkoitus olikin, että joku kirjoittaisi hänelle tuon pohjalta uuden koodin, joka ei käytä levyä.
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 FunctionTieto 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.
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.
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.
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?
No, olenhan lukenut vanhoja kirjoja ):
Kirja, mistä nuo luin, on kuitenkin kirjoitettu vuonna 2000.
Ehkäpä tekniikka on muuttunut...
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.
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.
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.
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.
Kiitos!
Kokeile googlata "memory-mapped file".
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.
Tuo MMF todellakin on näpärä ratkaisu!!! Kiitos kaikille!!!
Aihe on jo aika vanha, joten et voi enää vastata siihen.