Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Tiedosto heksamuotoon

Sivun loppuun

Milu [18.12.2013 16:32:48]

#

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?

Antti Laaksonen [19.12.2013 03:05:58]

#

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

Milu [20.12.2013 03:35:55]

#

No jummi, sehän oli siinä... Kiitos

Mites ascii2bin menis, siis suoraan .bin tiedostoks?

Antti Laaksonen [20.12.2013 17:55:42]

#

Mitä tarkoitat bin-tiedostolla? Mitä siinä pitäisi olla?

Metabolix [20.12.2013 19:02:01]

#

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).

Milu [20.12.2013 22:27:38]

#

No niinpäs on, se terminaali ohjelman tekemä ascii .log tiedosto jo tavallaan valmis "bin" tiedosto. Elikäs toi hexsa muutos siitä riittää.

Milu [26.12.2013 01:19:42]

#

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.

neau33 [26.12.2013 02:37:39]

#

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-

Milu [26.12.2013 04:17:08]

#

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.

Grez [26.12.2013 05:43:00]

#

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ää

Milu [26.12.2013 12:03:40]

#

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)

Grez [26.12.2013 14:34:36]

#

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

Milu [26.12.2013 14:36:23]

#

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?

Grez [26.12.2013 14:39:50]

#

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ä.

Milu [26.12.2013 14:53:31]

#

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.

Grez [26.12.2013 15:01:00]

#

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)

Milu [26.12.2013 15:12:52]

#

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.

jalski [26.12.2013 15:22:49]

#

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

Milu [26.12.2013 15:28:06]

#

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.

Grez [26.12.2013 17:01:26]

#

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

Milu [26.12.2013 18:01:08]

#

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

Metabolix [26.12.2013 18:08:36]

#

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.

Milu [26.12.2013 18:21:07]

#

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

Milu [26.12.2013 20:22:18]

#

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????

Grez [26.12.2013 20:48:22]

#

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.

Milu [26.12.2013 21:11:10]

#

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.

Grez [26.12.2013 21:30:31]

#

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.

Merri [28.12.2013 02:28:46]

#

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.

jalski [28.12.2013 18:48:14]

#

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);

Grez [28.12.2013 23:28:30]

#

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.

neau33 [29.12.2013 16:28:38]

#

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-

Grez [29.12.2013 16:40:36]

#

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ä.

neau33 [30.12.2013 09:49:22]

#

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-


Sivun alkuun

Vastaus

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

Tietoa sivustosta