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
Eikö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 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.
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.