Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6 hex vs. bin

Milu [13.11.2005 10:40:50]

#

Olen tekemässä periaattessa kolmiulotteista hex editoria joka muokkaa hexsa tiedostoa, muokattava alkuperäinen tiedoston on binääri tiedosto jonka joudun kääntämään bin2hex.exe,hex2bin.exe ohjelmila ennen muokkausta.

Tarkoitus olisi, että saisin käännettyä omassa ohjelmassa tiedostot ettei tarvitsisi erillisiä ohjelmia käyttää käännökseen.

Kysymys kuuluukin miten käännös toteutetaan?, onko käännös hexsasta biniin "suoraan" yks yhteen tarkistesummineen päivineen vai luoko ohjelma biniin omat tarkistesummat?
Vai miten se pitäisi toteuttaa?

Tällä hetkellä olen

- Kääntänyt bin tiedoston bin2hex.exe ohjelmalla.

- muokannut käännettyä hex tiedostoa, luonnut uudet tarkistesummat.

- kääntänyt hex tiedoston takaisin bin muotoon hex2bin.exe ohjelmalla.

Merri [13.11.2005 16:00:28]

#

Nopea johdatus: tiedosto koostuu tavuista. Joten kun luet vaikka tavun tiedostosta, voit sen näyttää haluamallasi tavalla. Tekstimuotoiseksi heksaksi muutettaessa tehdään siis sellainen temppu, että yksi tavu muutetaan kahdeksi merkiksi. Lisäksi pitää muistaa, että VB:ssä yksi merkki vie kaksi tavua silloin kun se sijaitsee string-muotoisessa muuttujassa.

Tämä esimerkki lataa vain palan tiedostoa kerralla muistiin muokattavaksi. Tämä rajoittaa avattavan tiedoston kokoa, eli esimerkiksi 2 Gt tiedoston avaaminen olisi aika tuskaa (vaatisi muistia 2 Gt * 2 merkkiä/tavu * 2-tavuinen merkki = 8 gigatavua...). Tämän takia useimmat "järkevät" ohjelmat muuttavat heksaksi vain näytettävän osan ja tallentavat muistiinsa tiedon siitä, mihin kohtiin muutoksia on tehty. Ja tallennettaessa vasta oikeasti tekevät muutokset. Hieman vaikeampi koodata, mutta nopeuttaa ohjelman toimintaa huomattavasti ja mahdollistaa todella isojen tiedostojen avaamisen nopeasti.

Heksa on siis kuusitoistalukujärjestelmä. Yksi tavu voidaan jakaa kahteen osaan, jotka molemmat ovat arvoltaan väliltä 0 - 15, ts. täydelliset heksaa varten.

' moduulissa
Public Function File2Hex(ByVal Filename As String) As String
    Dim ReadBuffer() As Byte, OutBuffer() As Byte
    Dim lngLen As Long, lngA As Long, lngB As Long
    Dim bytTemp As Byte
    ' tähän kannattaisi sitten lisätä virheentarkistuksia yms.
    lngLen = FileLen(Filename)
    ' ja tietysti FreeFile olisi poikaa
    Open Filename For Input As #1
        ' tee lukubufferista tiedoston kokoinen
        ReDim ReadBuffer(lngLen - 1)
        ' lue tiedosto bufferiin
        Get #1, , ReadBuffer
    Close #1
    ' nyt varataan tarpeeksi muistia ulospuskua varten
    ReDim OutBuffer(lngLen * 4 - 1)
    ' ja sitten pojat pidetään hauskaa!
    For lngA = 0 To lngLen - 1
        ' sitten suoritetaan ihana muunnos:
        ' ota neljä ylintä bittiä ja muunna merkiksi nolla
        bytTemp = (ReadBuffer(lngA) \ 16) Or 48
        ' sitten jos luku on isompi kuin 57, lisää seitsemän
        ' elikkä yhdeksän jälkiset merkit pomppaavatkin kirjaimeen A
        If bytTemp > 57 Then bytTemp = bytTemp + 7
        ' ja sitten ulostuloon vaan...
        OutBuffer(lngB) = bytTemp
        ' sitten vielä samat temput alemmalle neljälle bitille
        bytTemp = (ReadBuffer(lngA) And 15) Or 48
        If bytTemp > 57 Then bytTemp = bytTemp + 7
        OutBuffer(lngB + 2) = bytTemp
        ' sitten hypätään ne pari merkkiä eteenpäin
        lngB = lngB + 4
    Next lngA
    ' nyt meillä on sitten valmis byte array, joka voidaan muuttaa stringiksi
    File2Hex = CStr(OutBuffer)
End Function

Varoitus: en testannut, kunhan kirjoitin ajanvietteeksi.

Milu [13.11.2005 18:04:24]

#

juu, kyseinen ohjelma ei ole mikään yleiseditori joten tiedostokoot eivät oli niin suuria, että muisti aiheuttaa ongelmia, ne ovat eprommin tiedostoja.

Muunnosasia oli hyvin esitetty joten kiitos siitä, mutta vaivaamaan jäi pari asiaa.

Tällähetkellä kun olen kääntänyt sen tiedoston bin2hex:lla
Niin rivillä on ollut 9 merkkiä(mitä?) ja sitten 64 merkkiä(itse tietoa sisältävä osa) ja sen jälkeen 2 merkkiä tarkistesumma.

Eli

:20000000FFFFFF........FF

Kysymys 1
Mitä nuo 9 ensimäistä merkki ennen varsinaista tietoasisältävää osaa ovat(rivinumero? tiedostotyppi? tunniste?).

Kysymys 2

Käännetäänkö siinä muunnoksessa hexsasta binii myös tuo alku osa ja tarkistesumma lopusta vai pelkästää se 64 merkkiä tieto sisältävä osuus.

Se miksi alkuosaa en aikasemmin ole yrittänyt selvittää johtuu siitä kun ole käyttäny noita valmiita kääntäjiä, olen vain muokannut tietoa sisältävää osaa ja laskenut sinne perään sen tarkistesumman.

zacura [13.11.2005 19:36:27]

#

Veikkaisin että kyse on "Intel hex file" muotoisista tiedostoista (täsmäävät kuvaukseen). Formaation kuvaus löytyy esim tuolta: http://www.keil.com/support/docs/1584.htm

edit: typoja

Milu [13.11.2005 20:12:25]

#

No nyt selvis sekin, Jos joku ei satu tietämään kysymys 2 selviää kyllä, kun saan ton muunos pätkän valmiiksi niin vertaan sitä hex2bin.exe ohjelman tekemään muunnokseen.

Vastaus

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

Tietoa sivustosta