Yritän lukea tekstitiedostoa joka sisältää kaikenlaisia ascii merkkejä, lukeminen pysähtyy ennen tiedoston loppua ??
Katsoin notepad2 editorilla mihin merkkiin se loppuu ja se lukee viimeisen merkin STX ja ei lue enää seuraavia merkkejä SUB FF NUL jne...
Tarkoitus olisi saada se ascii tekstitiedosto Hexsadesimaali muotoon.
Luku muuttuja on string, miten se pitäisi oiken toteuttaa?
Seuraava koodi lukee tiedoston sisällön tavu tavulta ja tulostaa tavut ikkunaan heksamuodossa:
FontName = "Courier" Open "c:\teksti.txt" For Binary As #1 Dim i As Long, x As Byte For i = 1 To LOF(1) Get #1, , x Print Right("0" + Hex(x), 2) + " "; If i Mod 16 = 0 Then Print Next Close #1
No jummi, sehän oli siinä... Kiitos
Mites ascii2bin menis, siis suoraan .bin tiedostoks?
Mitä tarkoitat bin-tiedostolla? Mitä siinä pitäisi olla?
Nythän oikeastaan olet muuttamassa binääridataa tekstiksi. Jos tallennat tiedostoon tekstin 23 A3 FF, se ei ole binääritiedosto vaan tekstitiedosto. Jos taas tallennat tiedostoon tavut 23 A3 FF, se voi näyttää Muistiolla avattuna merkeiltä #£ÿ, mikäli Muistio olettaa sen olevan Windows-1252-merkistössä. Mielestäni tämä jälkimmäinen on enemmän binääridataa.
Jos haluat muuttaa merkit #£ÿ tekstiksi 23 A3 FF, ohjelmasi nimi pitäisi loogisesti olla bin2hex tai hexdump. Tällaisen ohjelman voit tehdä helposti, kun vain avaat toisen tiedoston kirjoitustilassa ja laitat edellisen koodin Print-komennot kirjoittamaan tiedostoon.
Sen sijaan ohjelma nimeltä bin2ascii saattaisi tuottaa tuloksen #<A3><FF>, koska #-merkki kuuluu ASCII-merkistöön mutta tavut A3 ja FF eivät kuulu; ASCII-merkistö on 7-bittinen eli sisältää vain koodit 0–127 (00–7F).
No niinpäs on, se terminaali ohjelman tekemä ascii .log tiedosto jo tavallaan valmis "bin" tiedosto. Elikäs toi hexsa muutos siitä riittää.
Helppiä, nyt ei jotenkin osaa sisällyttää itselle tota asiaa.
Elikäs jos luen tiedostosta 2 merkkiä peräkkäin ja yhdistän ne 16 bittiseksi luvuksi eli luku = CLng("&H" & Hex(x1) & Hex(x2)) joka on desimaalisena 590 ja heksana 024E, miten pätkin ton desimaali luvun 590 uudestaan 8 bitin merkiksi jonka voin kirjoittaa tiedostoon takaisin merkki kerrallaan.
Eli idea on lukea sieltä tiedostosta 16 bittinen tai 8 bittinen luku desimaalina ja muuttaa sitä haluamakseen ja kirjoittaa takaisin.
MOI!
Milu kirjoitti:
Eli idea on...
Mietis nyt uudestaan, että mikä se idea oikein oli!
No joo jos sä nyt yhdistelet noita tavuja '16-bittisiksi' ja sitten haluut pätkiä ne takaisin '8-bittisiksi' niin, että arvot on alkuperäsiä niin ei ole mitään muuta tapaa, kuin että tallentelet sen ensimäisen arvon kustakin yhdistelmästä joko eri tiedostoon tai saman tiedoston perään erotettuna jollain merkillä ja sit vähentelet aina sen eka-arvon siitä '16 bittisestä arvosta' jne. MISSÄ HOMMASSA EI KUITENKAAN OLE SITTEN MINKÄÄN NÄKÖISTÄ JÄRKEÄ!!!
-Nea-
Tiedosto on binääri/image vai mikä se nyt on oikealta nimeltään on.
Tiettyssä kohdassa tiedostoa sijaitsee kahdessa tavussa 16 bittinen luku.
Luenko sen 16 bittisen luvun tavu kerraan sieltä ulos ja muutan sen desimaaliseksi.
Entäs kun haluan muutaa sitä lukua ja kirjoittaa sen takaisin sinne, niin joutuuko sen kirjoittamaan
tiedostoon takaisin saman lailla tavu kerrallaan kun se on sieltä luettukin.
Eikös siinä joudu yhdistelemään kahta tavua luettaessa ja taas kirjoittaessa eroittelemaan, olenko aivan hakoteillä asiassa vai voiko sieltä lukea kaksi tavua kerrallaan?
Siellä tiedostossa on 8 ja 16 bittisiä lukuja joita pitää lukea sieltä ulos ja ne luvut eivät ole sielä suoraan tekstimuodossa desimaalisena.
No jos luen esimerkiksi 16 bittisen luvun sieltä ensimmäinen tavu on 2 ja toinen tavu on 78 silloin siellä on desimaalisena luku 590 kahdessa tavussa ( 16 bittisenä)
Sitten haluan kirjoittaa tiedostoon samaan kohtaan takaisin kahteen tavuun luvun 600, miten sen teen, että se tiedosto pysyy alkuperäisessä muodossaan binääritiedosto eikä tekstitiedosto?
Kun en sitä tiedä miten tuollaisia binääritiedostoja pitää lukea ja kirjoittaa oikealla tavalla.
binääritiedostosta voi lukea ja sinne voi kirjoittaa ihan suoraan minkä tahansa kokosia muutujia (lukuja) ihan suraan ilman mitään säätöä.
Get ja Put toimii suoraan kaikille muuttujatyypeille. Ainoastaan merkkijonojen kanssa tarvii itse säätää
No yritetään vielä yhden kerran selventää mitä yritän ajaa takaa.
Siis antin esimerkin mukaan kun lukee sieltä binääritiedostosta ensimmäisen ja toisen tavusn eli ensimmäinen tavu muutettu heksaluvuksi on 02 ja
toinen tavu muutettuna heksaluvuksi on 4E.
No ny ne kaksi peräkkäistä tavua sisältää desimmalisksi muutettuna 16 bittisen luvun 590. Sehän voisi olla luku väliltä 0-65535 (0000-FFFF) koska se on 16 bittinen
Sitten haluan muuttaa sen 16 bittisen kahden tavun luvun vaikka desimaaliluvuksi 20000 ja kirjoittaa sen takaisin sinne binäritiedostoon samoihin ensimmäiseen ja toiseen tavuu.
No se luku 20000 on heksana 4E20, niin enhän minä sinne nyt ala kirjoittamaan "put#1, , 20000" enkä "put#1, , 4E20" vaan miten pätkin ton kahden tavun 16 bittisen desimaaliluvun takaisin kahdeksi TAVUKSI jonka kirjoitan takaisin sinne tiedostoon.
Sen tiedosto on esimerkiksi 320kb eli 327680 tavun kokoinen ja sellaisena sen pitää pysyäkkin vaikka kirjoitan eri arvon niiden "kahden tavun tilalle"
Metabolin esimerkin mukaan siellä yhdessä tavussa voi olla heksana merkki väliltä 00-FF, eli siellä on muutakin kun ASCII merkki 7 bittisenä 00-7F
Se vielä kun luen sieltä get käskyllä sitten byte tai string *10 muuttujan sen ensimmäinen get#1, ,x lukukäsky muuttuja antaa sen merkin 2 eli (hex 02) seuraava luku olis sitten merkki 78 eli se (hex 4E)
Milu kirjoitti:
Sitten haluan muuttaa sen 16 bittisen kahden tavun luvun vaikka desimaaliluvuksi 20000 ja kirjoittaa sen takaisin sinne binäritiedostoon samoihin ensimmäiseen ja toiseen tavuu.
No haluat kirjoittaa sinne tiedostoon 16-bittisen luvun 20000, niin luontevin tapa olisi tehdä niin:
Dim i As Integer 'Integer on 16-bittinen kokonaisluku i = 20000 Put #1, , i
En näe oikein mitään syytä tehdä asiaa sen monimutkaisemmin.
Milu kirjoitti:
Se vielä kun luen sieltä get käskyllä sitten byte tai string *10 muuttujan sen ensimmäinen get#1, ,x lukukäsky muuttuja antaa sen merkin 2 eli (hex 02) seuraava luku olis sitten merkki 78 eli se (hex 4E)
No se kyllä riippuu mitä käsket sen lukea. Jos luet 16-bittisen luvun, niin silloin se lukee nuo molemmat merkit Intel tyyliin vähiten merkitsevä ensin...
Dim i As Integer Get #1, , i 'Nyt i on &H4E02
No sitten samaan aihealueeseen liittyvä jatkokysymys.
En taaskaan tiedä toiminnon oikeata nimeä mutta sanotaako vaikka bitin kääntö.
Tietyssä osoitteessa sijaitsee 8 bittinen luku (bit7,bit6,bit5,bit4,bit3.bit2,bit1,bit0) luku on esim. hex 8 (00001000) ja siitä pitäisi saada tuo bit4 käänettyä ykköseksi.
Eikös se pidä silloin maskata luvulla hex 10 (00010000), että saadaan se luvuksi hex 18 (00011000),jossa tuo bittijärjestys pysyy samana mutta vain neljäs bitti kääntyy?
Eli lukea tavu ja tarkistaa onko bitti4 lippu ylhäällä vai alhaalla ja kääntää se tarvittaessa.
Onko tuohon jotain valmista käskyä vai miten sen pitäisi toteuttaa?
No jos haluat asettaa johonkin lukuun bitin 4 päälle (riippumatta siitä oliko se pois päältä vai ei alunperin) niin helpointa olisi vaan tehdä or..
Luku = Luku Or &H10
Ja ihan näin asiasta seitsemänteen, kun selvästikin olet vasta aloittelemassa jonkin ohjelmointikielen opiskelua, niin en tiedä onko järkevää opetella käyttämään kieltä, josta uusin versio on tehty 15 vuotta sitten ja jota ei ole tuettu 5 vuoteen?
Jossain vaiheessa huomaat että saadaksesi ohjelmasi toimimaan ja hyödyntääksesi uusien järjestelmien ominaisuuksia, joudut joko hylkäämään kaiken vanhan koodisi tai opettelemaan uuden ohjelmointiympäristön ja kääntämään ohjelmat uudelle alustalle.
Itsellä on vielä jokusia ohjelmia portattavana VB6:sta, ja kyllä harmittaa etten jo 10 vuotta sitten tehnyt kaikkea uutta jollain muulla kielellä.
Grez
Nyt taitaa kirjoittaa tavut väärin päin vähiten merkitsevä tulee ensimmäiseen tavuu, pitäis olla big endia
Lisäys:
Grez
Olet oikeassa, mutta kun oppis vähän alkeita tästä niis sit jos innostus riittää vois siirtyä uudempiin kieliin.
Milu kirjoitti:
Nyt taitaa kirjoittaa tavut väärin päin vähiten merkitsevä tulee ensimmäiseen tavuu, pitäis olla big endia
Niin, tietysti jos tiedostomuoto on määrätty ja/tai on tarkoitus siirrellä tiedostoja jonkin muun kuin PC-laitteen kanssa, niin voi olla perusteltua käyttää big endiania.
Jos tarkoitus on ihan PC:llä hypistellä tiedostoja, niin silloin lienee järkevää käyttää sitä oletusta, eli little endiania.
VB6:lla valitettavasti tavujen järjestyksen muuttaminen on vähän kökköä johtuen monestakin tekijästä (mm. koska ei bit-shift operaatioita, byte on etumerkitön ja muut kokonaisuluvut etumerkillisiä)
(Edit: korjattu tavujärjetyksen nimet)
Muilla editoreilla kun sitä tiedostoa tarkastelee siellä kahdessa ensimmäisessä tavussa on se 024E
Nyt se kirjoitti sinne kahteen tavuun heksana 4E02 ??? kun katsoo sitä editorilla.
Et siis se pitäis ollakin just sen Little endian?
Lisäys: Se on ohjelmointilaitteen lukema flas muistin binääri tiedosto, että samanlaisena se pitäis pysy eli 024E että sen voi takaisin kirjoittaa sinne flas muistiin ohjelmointilaitteella.
Milu kirjoitti:
Olet oikeassa, mutta kun oppis vähän alkeita tästä niis sit jos innostus riittää vois siirtyä uudempiin kieliin.
Kielen ei välttämättä tarvitse olla uusi, mutta tuettu se saisi olla. Esimerkiksi 50-vuotta käytössä olleet kielet, kuten Fortran ja PL/I suoriutuvat tämän tyyppisistä tehtävistä edelleen erinomaisesti.
Editoitaessa jotain tietyn tyyppistä tiedostoa, voisi olla helpointa jättää laskeminen kääntäjälle. Esim. PL/I:llä määrittäisin based tyyppisen struktuurin, mikä kuvaisi tiedoston headeria sekä osoittimen. Lukisin tiedoston sisällön puskuriin ja laittaisin osoittimen osoittamaan siihen. Nyt based tyypisen struktuurin kenttiä muuttamalla pystyisin helposti muuttamaan haluttua osaa puskurissa. Kun muutokset olisi tehty, voisi puskurin sisällön dumpata tiedostoon ja tuloksena olisi toimiva muokattu tiedosto.
VB6:n ominaisuuksista ja mahdollisuuksista Grez pystyy kertomaan paremmin...
Tarkoitus olisi tehdä sellainen pieni apuohjelma jolla pääsisin muuttamaan sen dinääritiedostin tiettyjä 8 bitin tavuja ja 16 bitin kahden tavun yhdistelmiä, että ei täytyisi hex editorilla sitä avata ja sieltä etsiä muutettavat kohdat.
Tiedän ne sijainit tiedostossa mistä pitää yhden tavut 8 bittinen tai kahden tavun 16 bittinen luku muuttaa haluamakseni.
siis kai aika yksinkertainen toimenpide kun vaan tietäisin miten se oikeaoppisesti pitää tehdä
Lisäys: Tai ei nyt oikeaoppisesti vaan senverran yksinkertaisesti, että minullakin olisi se mahdollisuus toteuttaa.
No kun siis big endiania täytyy tukea niin ehkä tuossa nyt sitten kuitenkin on helpointa lukea ne tavuina
Option Base 0 Dim Puskuri(1) As Byte Dim Luku as Long Get #1, 123, Puskuri '123 tilalle oikea lokaatio Luku = Puskuri(0) * &H100 Or Puskuri(1)
Laitoin nyt tarkoituksella Luku muuttujaksi 32-bittisen niin ei tarvitse välittää siitä että VB on rasittava negatiivisten lukujen suhteen. Eli nyt muuttuja saa arvot väliltä 0 ja 65535
Jos halutaan, että saadaan arvot -32768 - 32767 niin tulee mieleen useita toinen toistaan ärsyttävämpiä tapoja tehdä se :D, esim:
Option Base 0 Dim Puskuri(1) As Byte Dim Luku as Integer Get #1, 123, Puskuri '123 tilalle oikea lokaatio Luku = (Puskuri(0) And &H7F) * &H100 Or Puskuri(1) If (Puskuri(0) And &H80) Then Luku = Luku Or &H8000
No niin nyt se luku tulee oiken suoraan desimaalisena luku muuttujaan ja voin käsitellä sitä lukua haluamallani tavalla, edistystä.. :D
No sitten kun olen hypistelly ja pyöritellyt sitä lukua ja haluan kirjoittaa sen takaisin litte endia muodossa, miten se tapahtuu ettei siellä mene ne tavut taas väärinpäin. Kun jos tosta kirjoitan sinne put# 1,123,luku niin se kirjoittaa ne tavut sinne big endia muodossa väärin päin.
Hyvä tuo esimerkki tuosta nekatiivisesta arvosta se olisi tullut vastaan varmaan jossain vaiheessa.
Sellainen tuli mieleen, että olisiko silti selkämpi käsitellä sitä tiedostoa siinä big endia muodossa luettaessa ja kirjoittaessa mikä tuo vb6 oletus kai on?
Kun eikös sitä ole joku bitin juoksutus/pyöritys juttu jolla saadaan se muuttujassa oleva luku muuttumaan big endiaks ja litte endiaks vai ooko ihan hakoteillä?
Se muuten herjaa tota Option Base 0 "invalid inside procedure" on se sit missä välissä tahansa..
Grez kirjoitti:
Tuo että vähitsen merkitsevä tulee ekaan tavuun on nimenomaan big endian.
Eipä muuten ole. Big endianissa tulee eniten merkitsevä ensin, ja x86:n natiivi muoto (ja siten varmaankin myös VB:n Put-komennon muoto) on little endian eli vähiten merkitsevä ensin.
Se on kai joku motorla big endia format??? ei varma
Mut jos laitan tavallisen integer muuttuja ja luen sen kaks ensimmäistä tavua get käskyllä sieltä tulee desimaalisena 19970 ja pitäis tulla se 590, tuolla Grez esimerkillä saan sen oikeassa muodossa kokonaislukuna tuohon muuttujaan.
Tietysti selkeempi olis jos 19970 desimaali luvun sain käänettyä pelkästään ohjelmassa siihen toiseen muotoon 590. joten bittiä pyörittelemällä.
Muuten se mun binääritiedosto on niin sekaisin et ei kyllä laitteet vörki... :D
Kun eihän sillä pitäisi olla väliä luenko sen kaksi tavua sieltä tiedostosta MSB tai LSB muodossa, kun jos se on väärässä muodossa eikö VB6:ssa ole käskyä joka juoksutta sitä binärijonoo oikealle tai vasemmalle sen 8 bitti.
Kun eikös jos se kahden tavun luku on esim.
Dec 19970 = hex 4E02 = bit 0100111000000010
Niin silloin kun siirtää bittejä 8 jompaankumpaan suuntaan tule luku
Dec 590 = hex 024E = bit 0000001001001110
vai meneekö se johonkin for next silmukkaan jossa se pitää binääritasolla toteuttaa????
Metabolix kirjoitti:
Eipä muuten ole. Big endianissa tulee eniten merkitsevä ensin, ja x86:n natiivi muoto (ja siten varmaankin myös VB:n Put-komennon muoto) on little endian eli vähiten merkitsevä ensin.
Juu, onnistuin ajattelemaan nämä väärinpäin. :( Korjasin aikaisempiin viesteihini.
Milu kirjoitti:
Kun eihän sillä pitäisi olla väliä luenko sen kaksi tavua sieltä tiedostosta MSB tai LSB muodossa, kun jos se on väärässä muodossa eikö VB6:ssa ole käskyä joka juoksutta sitä binärijonoo oikealle tai vasemmalle sen 8 bitti.
Kuten sanoin, niin VB6:ssä ei ole varsinaisia bittijonon juoksuttamiskäskyjä, vaan se täytyy tehdä kerto- ja jakolaskuja käyttäen, kuten edellisessä esimerkissäni oli tehtykin. Eli 16-bittisen kokonaisluvun tavujen vaihto VB6:lla:
i = ((i And &H7F) * &H100) Or ((i And &H7F00) \ &H100) Or IIf(i And &H80, &H8000, 0) Or IIf(i And &H8000, &H80, 0)
Yleisesti ottaen VB6 on todella huono kieli kaikenlaiseen bittitason nysväykseen.
Do dii, nyt se hoituu kyllä kätevästi, en mene ainakaan sekaisin siinä binääritiedostossa. Iso kiitos!
Testailin sitä bitin kääntöä ja Xor käskyllä saan sen tietyn tavun tietyn bitin sieltä vaihtamaan lipun ylös tai alas ja And käskyllä tarkistettua kumpi se on ennen vaihtoa, meneekö oikei? Tiedostossa ainakin näyttäisi olevan tavu silloin oiken.
Milu kirjoitti:
Xor käskyllä saan sen tietyn tavun tietyn bitin sieltä vaihtamaan lipun ylös tai alas ja And käskyllä tarkistettua kumpi se on ennen vaihtoa, meneekö oikei?
Kyllä, juuri noin.
Tässä vielä huomattavasti paremmalla suoritusnopeudella, koska IIf on järkyttävän hidas:
i = ((i And &H7F) * &H100) Or ((i And &H7F00) \ &H100) Or (((i And &H80) = &H80) And &H8000) Or (((i And &H8000) = &H8000) And &H80)
Toiminta tässä perustuu siihen, että VB6:n Boolean (eli True tai False) on oikeasti 16-bittinen luku, jossa False on 0x0000 ja True on 0xFFFF. Näinpä tekemällä täsmäävyysvertailu bitin valinnan jälkeen saadaan ulos boolean, jossa on joko kaikki bitit päällä tai ei ainutkaan bitti päällä, ja Andin avulla voi valita sen minkä haluaa. Tämäkin siis tekee pari ylimääräistä operaatiota verrattuna juoksuttamiseen, mutta se on sentään yksinkertaista tavaraa prosessorille. Toisin kuin IIf, joka on varmaan kaikin mahdollisin tavoin väärin toteutettu.
Tämäkin taisi toimia oikein:
i = ((i And &H7F) * &H100) Or (((i And &HFF00) \ &H100) And &HFF) Or (((i And &H80) = &H80) And &H8000)
Tietty jos dataa on tosi vähän käsiteltäväksi, niin näillä muutoksilla ei suuria eroja huomaa tuijottamatta millisekuntimittaria.
Tuon big endian muodossa olevan tiedon käsittely VB6:n kanssa on kyllä kohtuullisen monimutkaista. Osaako mikään nykyisistä yleisesti käytössä olevista ohjelmointikielistä ja kääntäjistä käsitellä sujuvasti big endian ja little endian muodossa olevaa tietoa?
PL/I:llä binääridatan muunnoksen voi jättää kääntäjän huoleksi lisäämällä muuttujan määrittelyyn bigendian tai littleendian attribuutin. Jos attribuutin jättää määrittelystä pois, käyttää PL/I järjestelmän natiivia tallennusmuotoa.
Binääritiedoston käsittely big endian muodossa sujuisi:
/* based structure for describing file data, no memory is allocated. */ dcl 1 filedata based(p) bigendian, 2 header, 3 num1 fixed bin(32) unsigned, 3 num2 fixed bin(32) unsigned, 3 num3 fixed bin(32) unsigned, 2 data, 3 data1(0:255) fixed bin(8) unsigned, 3 data2(0:255) fixed bin(8) unsigned; dcl p ptr; dcl (in, out) file record; dcl i fixed bin; /* Open input file for reading and output file for writing */ open file(in) title('/in.bin,type(fixed),recsize(524)') input; open file(out) title('/out.bin,type(fixed),recsize(524)') output; /* read in input file record. Let PL/I allocate buffer for data and set pointer to it. */ read file(in) set(p); /* Change some data. Just to show how easy it really is. */ num1 = 258; num3 = 20; do i = 0 to 255; data1(i) = i; data2(i) = i; end; /* Dump modified data into output file */ write file(out) from(filedata); close file(in); close file(out);
Osaakohan muuten kääntäjät muuttaa esim. 32-bittisen tavujen järjestyksen muuttamisen BSWAP komennoksi.. hmmm
Edit: Vastaan itselleni. Ainakaan GCC ei näköjään osannut. Eli koodaajan piti heittää itse koodiin __builtin_bswap32 jos halusi saada lopputulokseen konekielikäskyn bswap.
Moi!
Rupes vähän hämään jo ennenen tota yksittäisten bittien käpistelyä, mutta...
Private Sub Command1_Click() If Dir(App.Path & "\bin.dat") <> "" Then Kill App.Path & "\bin.dat" End If tallennellaan VB6:lla binary tiedostoon integer tyyppisen muuttujaan sijoitettu luku... Open App.Path & "\bin.dat" For Binary Access Write As #1 Dim luku As Integer luku = 590 Put 1, , luku Close #1 End Sub Private Sub Command2_Click() '... ja luetaan sit ne pari ekaa tavua siitä tiedostosta Byte taulukkoon Dim bytes() As Byte Open App.Path & "\bin.dat" For Binary Access Read As #1 ReDim bytes(LOF(1) - 1) Get 1, , bytes Close #1 Dim HexStr As String 'ja vaihdetaan vaan ne tavujen paikat niin For i = UBound(bytes) To LBound(bytes) Step -1 HexStr = HexStr & Hex$(bytes(i)) Next HexStr = "&H" & HexStr MsgBox CInt(HexStr) 'saadaan se sama v***n luku sieltä pihalle End Sub
-Nea-
Mitäköhän ideaa tuossa nyt on kirjoittaa 16-bittinen kokonaisluku 16-bittisenä kokonaislukuna ja lukea ulos kahtena 8-bittisenä, jotka muunnetaan merkkijonomuunnoksen kautta?
Bittien käpistely liittyi siihen, että tiedostossa ne tavut täytyy olla päinvastaisessa järjestyksessä kuin tuossa esimerkissäsi. Toki esimerkistäsi voitaisiin vaihtaa tavujen järjestys (jolloin myös kirjoittaminen tehtäisiin leikkimällä välillä merkkijonoilla), mutta mitään hyötyä jo esiteltyihin tapoihin verrattuna siinä olisi vaikea nähdä.
MOI!
no kirjoitetaan se 8-bittisinä ja luetaan 16-bittisenä
Private Type BStruct Hi As Byte Lo As Byte End Type Private Type IStruct value As Integer End Type Dim bytes() As Byte Private Sub Command1_Click() ReDim bytes(1) BSwap 590, bytes(0), bytes(1) MsgBox CInt("&H" & Hex$(bytes(1)) & Hex$(bytes(0))) Dim value As Integer Open App.Path & "\bin.dat" For Binary As #1 Put 1, , bytes Seek 1, 1 Get 1, , value Close #1 MsgBox value End Sub Public Sub BSwap(ByVal value As Integer, ByRef Hi As Byte, ByRef Lo As Byte) Dim TempI As IStruct Dim TempB As BStruct TempI.value = value LSet TempB = TempI Hi = TempB.Hi Lo = TempB.Lo End Sub
-Nea-
Aihe on jo aika vanha, joten et voi enää vastata siihen.