Delphin vanha versio (6?) antoi vastaukseksi A301 heksasta 41 2D 01:
j := 4; for i := 0 to high(arrProtocol) do begin PChar := @L000[j]; arrProtocol[i].pdTag := Pchar^; PSmallInt := @L000[j + 1]; arrProtocol[i].pdNo := PSmallInt^; // PWord := @L000[j + 1]; // arrProtocol[i].pdNo := PWord^; j := j + 3;
Nyt uudella versiolla A tulee ok, nroksi vain eka tavu eli 45 ja satanen (256) puuttuu ('Word' ei muuta tilannetta).
Alunperinkö väärin koodattu?
Mod. lisäsi kooditagit
Eli heksadesimaaliluku "A301" pitäisi muuttaa 10-järjestelmään? Mulla siitä tulee 41729.
EDIT: Poistettu koodi, jossa ei ollut kysymyksen kannalta hyötyä.
Edit: Pienen ihmettelyn jälkeen keksin, että 301 = $12d. Ilmeisesti tarkoitus on siis muuttaa tavut (41, 2D, 01) siten, että ensimmäinen tulkitaan ASCII-arvona ja kahdesta seuraavasta lasketaan luku. Ensimmäinen onnistuu suoraan tyypinmuunnoksella, ja jälkimmäisessä kannattaa laskea tavu kerrallaan, jottei tavujen merkitsevyysjärjestys (big/little endian) pääse sotkemaan ohjelmaa eri alustoilla.
program muunnos; var taulukko: Array [0..2] of Byte; merkki: Char; luku: Integer; begin taulukko[0] := $41; taulukko[1] := $2d; taulukko[2] := $01; merkki := Char(taulukko[0]); luku := taulukko[1] + $100 * taulukko[2]; WriteLn(merkki, ', ', luku); {A, 301} end.
Voisit kyllä pyrkiä kirjoittamaan kysymyksesi selkeämmin, esimerkiksi kuten itse tämän viestin alussa sen muotoilen. Tulkitseminen kesti nimittäin aika kauan.
kiitti vastauksista.
Vanha delphi osasi ottaa suoraan kaksi tavua smallinttiin, niinkuin mielestäni sen kuuluukin tehdä. Nyt ihmettelen mitä smallintillä on virkaa jollei se muistista osaa kahta peräkkäistä tavua käsitellä.
(joo, oikaisin kysymystä kun luulin että pikkuintiaanit ja charit olisivat liiankin tuttuja).
http://www.netsoccer2.com/memHexEditor.rar
Tässä olis tämmöinen 'Memory hex editor' ohjelma sorsineen, jos kiinnostaa tutkiskella. :)
edit.
Ohjelman alussa, klikkaa prosessia hiiren oikealla niin voit ladata prosessin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.