Kirjoittaja Aihe: VAX/VMS date PC-muotoon?  (Luettu 9823 kertaa)

New_user

  • Käyttäjä
  • Viestejä: 1247
    • Profiili
VAX/VMS date PC-muotoon?
« : 01.04.16 - klo:10.26 »
Tässä ennen heittäytymistä vapaaherraksi kokonaan haluaisin tehdä yhden jutun. Hallinnassa on sequentiaalitiedostoja kiinteällä tietuepituudella VAX/VMS-järjestelmästä, ja ongelmana ovat tiedostojen päivämäärätietueet, joita on useampia yhdessä tietueessa. Tietueiden sisältämät tekstikentät ja LONG-muuttujat menivät helposti, koska ovat suoraan PC-yhteensopivia. DATE sen sijaan poikkeaa radikaalisti PC-maailman aikamuuttujasta. Haluaisin kuitenkin nuo käännetyksi PC-muotoon. Olisikohan kellään apuja. Muuttuja on 8 tavuinen little edian luku, jonka määritelmä on tuossa alla. Microsoftin basicissa aikamuuttuja on myös 8-tavuinen, ja toinen 8-tavuinen muuttuja on double, mutten osaa konversiota. Kenties tuossa pitäisi tuhria itsensä bitteihinkin jopa?

Koodia: [Valitse]
The OpenVMS native time is a 64-bit (quadword, eight-byte, little-endian) value containing the numbers of 100 nanosecond intervals since 00:00 on November 17, 1858 local time; the OpenVMS Epoch.
The time value is updated at centisecond intervals; the accuracy of this time value is less than its precision.
This usage is common across the VAX, Alpha and I64 Integrity Itanium hardware platforms.

Olen Basic-miehiä, ja jos jollakin olisi heittää periaatteellista koodinpätkää tuohon konversioon. Itse muuttujat osaan lukea tiedoston tietueista ja kirjoittaa konvertoidun muuttujan uuteen tiedostoon
« Viimeksi muokattu: 01.04.16 - klo:10.38 kirjoittanut New_user »

retu

  • Käyttäjä
  • Viestejä: 949
    • Profiili
Vs: VAX/VMS date PC-muotoon?
« Vastaus #1 : 02.04.16 - klo:11.16 »
Mikähän tuo MS basic mahtaa olla? Onko se visuaalinen? Onko siinä piste ja netti? Vai joku jämä dos ajalta?

Toinen kysymys on sitten miten tarkasti nuo pitäisi muuntaa. Kalentereita on rukattu aikojen saatossa moneen kertaan, joten voi mennä monimutkaiseksi. Käytännössä kuitenkin melko helppoa, jos ne pvm:t on tältä tai viime vuosisadalta eikä tartuta ihan lillukanvarsiin.

Tuo VAX pvm on 64-bittinen kokonaisluku, joten auttaisi kovasti että sellainen tietotyyppi sattuisi löytymään basic murteestasi. Muuten kannattaa aloittaa pyyhkimällä pölyt niistä bitinviilausvermeistä. Esim. vb.net long on 64-bittinen. Vaikka joku vb6 ei suoranaisesti sisällä sellaista, Currency tyyppiä käyttäen voisi huijata. Esim. jotenkin tälleen:
Koodia: [Valitse]
Function VaxPvm2Date(VaxPvm As Currency) As Date
   Dim VaxEpoch As Date
   Dim TmpPvm As Double

   VaxEpoch = DateSerial(1858, 11, 17)
   TmpPvm = VaxPvm / 1000 'sekunneiksi
   TmpPvm = TmpPvm / 86400 'päiviksi
   VaxPvm2Date = TmpPvm + VaxEpoch
End Function
' ja sitten
VbPvm = VaxPvm2Date(LukaseVaxPvmTiedostosta(nFile))
Siis:
  • Currency on 64-bittinen luku, jota skaalataan automaattisesti kertoimella 10000. Niinpä, kun siihen kopioidaan VAX:n pvm, se sisältää ajan millisekunteina lukien VAX epochista.
  • Vb:n Date on käytännössä kuten Double eli liukuluku, jonka kokonaisosa kertoo päivien lukumäärän vb:n epochista. Desimaaliosa kertoo kellonajan (0.5 on keskipäivä).
  • VAX:n pvm pitää siis skaalata samaan yksikköön eli päiviksi (jakolaskut).
  • Lopuksi korjataan epochien erotuksella.
Jos VaxPvm on vb.net Long, se pitää jakaa 10 miljoonalla että tulisi sekuntia.

Jos se basiccisi on oikeasti dos-ajalta, kehotan tutustumaan Free Basic ohjelmaan ennen bitinviilausta.

En tietenkään ole kokeillut tuota, mutta tässähän haettiinkin ideaa. ;D
« Viimeksi muokattu: 02.04.16 - klo:11.35 kirjoittanut retu »

New_user

  • Käyttäjä
  • Viestejä: 1247
    • Profiili
Vs: VAX/VMS date PC-muotoon?
« Vastaus #2 : 05.04.16 - klo:12.18 »
Hei, ja anteeksi vastaus vähän myöhään, kun erinäiset asiat pitäneet kiireisenä. Paljon kiitoksia vastauksesta, ja jos se tuolla ratkeaa, niin hieno homma. Nyt ihan tässä ei ole mahdollista testata, mutta lähimpien kuukausien aikana kyllä.

Vastauksina; muunnettavat päivämäärät ovat väliltä 1986-1998. Tarkkuus olisi vuorokausiluokkaa. Kun työtä on tehty päivisin työaikaan, ei ole vaaraa, että konversiossa vuorokausi vaihtuisi.
Basic-versioita olisi varmaan mahdollista käyttää seuraavasti: Quick Basic 4.0 Dos, VB 5, ja varmaan myöskin VB 6. Noiden alifunktioiden tekeminen sinänsä ihan tuttua.
Tosiaan, paljon kiitoksia tähän saakka. Eläköityminen olisi mukavampaa, kun olisi nuokin tiedostot konvertoitu.

Jos vielä löytyy ehdottoman "tieteellisesti pätevä" konversio Vaxin F-FLOATista (neljän tavun liukuluku) PC-maailman singleen, niin siinä se olisi vielä sauma auttaa. :)

nm

  • Käyttäjä
  • Viestejä: 16430
    • Profiili
Vs: VAX/VMS date PC-muotoon?
« Vastaus #3 : 05.04.16 - klo:22.16 »
Jos vielä löytyy ehdottoman "tieteellisesti pätevä" konversio Vaxin F-FLOATista (neljän tavun liukuluku) PC-maailman singleen, niin siinä se olisi vielä sauma auttaa. :)

libvaxdata vaikuttaa pätevältä:
https://www.mail-archive.com/simh@trailing-edge.com/msg04369.html
http://pubs.usgs.gov/of/2005/1424/

C-kääntäjän (tai Fortranin) kyllä joutuu lämmittämään tuota varten.

New_user

  • Käyttäjä
  • Viestejä: 1247
    • Profiili
Vs: VAX/VMS date PC-muotoon?
« Vastaus #4 : 07.04.16 - klo:15.40 »
Jos vielä löytyy ehdottoman "tieteellisesti pätevä" konversio Vaxin F-FLOATista (neljän tavun liukuluku) PC-maailman singleen, niin siinä se olisi vielä sauma auttaa. :)

libvaxdata vaikuttaa pätevältä:
https://www.mail-archive.com/simh@trailing-edge.com/msg04369.html
http://pubs.usgs.gov/of/2005/1424/

C-kääntäjän (tai Fortranin) kyllä joutuu lämmittämään tuota varten.

Kiitos. C ja Fortrankin nykyään ovat täyttä hepreaa, mutta jos joku pyöräyttäisi tuosta koodista dll:n josta voisi kutsua muunnosfunktiota, niin olisi hieno juttu. Kuitenkin, flotareiden konversiosta sanotaan näin kyseisen kirjaston dokumentissa:

Koodia: [Valitse]
Floating-Point Conversions

Intel 80x86 systems (Intel, 2005), Apple Macintosh systems (Apple Computer,
2004), and most Unix systems (Hewlett-Packard, 2002) implement the IEEE 754
floating-point arithmetic standard. VAX and IEEE formats are similar, after the bytes are
rearranged. (VAX floating-point formats inherit the PDP–11 memory layout based on
16-bit words in little-endian byte order.)
The high-order bit is a sign bit (s), followed by a biased exponent (e), and a
(usually) hidden-bit normalized mantissa (m). They differ in the number used to bias the
exponent, the location of the implicit binary point for the mantissa, and the representation
of exceptional numbers (e.g., ±infinity).
VAX floating-point formats: (–1)s × 2(e–bias) × 0.1m
Bit no.

F_floating

31                             0
mmmmmm_m1_mmmmmmseeeeeeeemm_m0_m

bias=128

Tuossa puhutaan tavujen vaihtamisesta, ja olenkin ratkaissut asian epätieteellisesti vaihtamalla basicia käyttäen kaksi tavua keskenään, ja verrannut sitten lopputulosta (kun VAX vielä oli pystyssä) tuhannella eri luvulla, ja kaikki olivat oikein. Epäilen kuitenkin, että ehkä tuo kahden tavun vaihtaminen ei riitä jossakin rajatapauksissa? Koodi on jossain tallessa, muttei nyt käsillä. Kommentit?


« Viimeksi muokattu: 07.04.16 - klo:15.42 kirjoittanut New_user »

matsukan

  • Käyttäjä
  • Viestejä: 2152
    • Profiili
Vs: VAX/VMS date PC-muotoon?
« Vastaus #5 : 07.04.16 - klo:16.35 »

Tuhat testitapausta on riittävä määrä koodin testaukselle. Jos kaikki meni ok voit taputtaa itsellesi.
Pohjois-pohjanmaa
-- motto:  backupin tarve huomataan aina liian myöhään

New_user

  • Käyttäjä
  • Viestejä: 1247
    • Profiili
Vs: VAX/VMS date PC-muotoon?
« Vastaus #6 : 08.04.16 - klo:10.36 »

Tuhat testitapausta on riittävä määrä koodin testaukselle. Jos kaikki meni ok voit taputtaa itsellesi.

Enpä menisi taputtamaan, kun käytännössä ei ole testattu millään äärimmäisillä luvuilla. Käytännössä itse konvertoitavat luvut olivat ihan analyysidataa, ilmeisestikään ei mitään "vaikeita lukuja" mutta silti mietityttää.
Muistin hiukan väärin. Kaivoin basic-ohjelmaani tekemäni kommentin. Tuossa on kuitenkin tavun arvosta vähennys ykkösellä, ja mitäs jos tavun arvo olisikin nolla?


Koodia: [Valitse]
'konversio siis tapahtuu siten, että Vaxin neljän tavun F-Floating (real)
'muutetaan stringiksi, vähennetään toisesta tavusta 1, ja laitetaan
'tavut uuteen järjestykseen

'Alla esimerkki, tavut heksalukuina Vaxilla ja mikrolla

'esimerkkinä VAXIN neljän tavun flotari, joka on desimaalina Vaxilla 5,900

'tavut VAXILLA     BC 41 CD CC
'                     --

'tavut mikrolla    CD CC BC 40
'                           --
« Viimeksi muokattu: 08.04.16 - klo:10.38 kirjoittanut New_user »

matsukan

  • Käyttäjä
  • Viestejä: 2152
    • Profiili
Vs: VAX/VMS date PC-muotoon?
« Vastaus #7 : 08.04.16 - klo:11.03 »
Miksi vähennät yhdestä tavusta yhden ?

edit

Uskoakseni voit tuolla verrata lukumuotojen muuttamista LE/BE välillä.

http://www.scadacore.com/field-applications/programming-calculators/online-hex-converter/
« Viimeksi muokattu: 08.04.16 - klo:11.06 kirjoittanut syrtek66 »
Pohjois-pohjanmaa
-- motto:  backupin tarve huomataan aina liian myöhään

retu

  • Käyttäjä
  • Viestejä: 949
    • Profiili
Vs: VAX/VMS date PC-muotoon?
« Vastaus #8 : 08.04.16 - klo:13.44 »
Jos katot tuota c-koodia, kyse ei ole pelkästä tavujen järjestyksen hämmentämisestä, vaan se myös "säätää" lopputulosta tietyissä tilanteissa, koska exponenttiosan "bias" on erilainen (mitä helkuttia se nyt sitten tarkoittaakaan).

Tuhat lukua on vain noin miljoonasosa mahdollisista, joten otos aika suppea. Se voi silti olla ihan pätevä, jos testilukusi ovat edustavia eli jos konvertoitavassa aineistossa ei ole niitä äärimmäisyyksiä.

Tuon algoritmin porttaus visual basicille voi olla hankalaa shift-operaattorin puutteen takia ja unsigned integerkin puuttuu. Tavujen hämmennys kyllä onnistuu käyttämällä api-functiota RtlMoveMemory.

Toisaalta free basicissä olisi shift ja unsigned integer ja loword/hiword functiot. ;)

New_user

  • Käyttäjä
  • Viestejä: 1247
    • Profiili
Vs: VAX/VMS date PC-muotoon?
« Vastaus #9 : 08.04.16 - klo:14.17 »
Enpä lähde freebasicia enää opettelemaan ;) Pyöräyttäkääs joku tuosta C-koodista dll ja vähän helppiä, miten kutsun tuota F-FLOAT muunnosta, niin teen lopun VB:llä ;)  Olin melko varma, ettei oma keksintöni Basicilla ollut riittävä.

retu

  • Käyttäjä
  • Viestejä: 949
    • Profiili
Vs: VAX/VMS date PC-muotoon?
« Vastaus #10 : 09.04.16 - klo:10.35 »
Ei sun tarvitse opella c:täkään. Tuossa kirjastossahan on valmiit vermeet windows-versiollekin. Avaat vaan sen projektin visual studiosi c-kääntäjällä ja klikkaat "build". Eiku, eipäs voikaan.  :-[

Jäi vähän vaivaamaan, niin latasin vielä tuon kirjaston ja katsoin uudelleen. Siellä on kyllä alihakemisto win32, mutta siellä on visual c:lle vaan komentojono, joka kääntää staattisen kirjaston ja testiohjelman. Ei siis ole mitään dll juttuja valmiina. :(
« Viimeksi muokattu: 09.04.16 - klo:11.01 kirjoittanut retu »

retu

  • Käyttäjä
  • Viestejä: 949
    • Profiili
Vs: VAX/VMS date PC-muotoon?
« Vastaus #11 : 11.04.16 - klo:19.16 »
Jaahas, tämä muuttikin tänne. No, onhan tämä vaxin päiväysten ja numeroiden ihmettely luonnollisesti melkoisen yleishyödyllistä keskustelua. Eikä mitenkään liippaa vaikkapa ohjelmointiin. :P

Kaivoin tänään töissä esiin vanhan pölynimurini, jossa visual studio 6, ja tarjosin noita libvaxdata koodeja sille. Vähän piti kyllä kopistella pölyjä myös omasta pääkopasta että mites nämä dll-jutut nyt c-kielellä menikään. En uskaltanut ronkkia niitä valmiita koodeja, joten lisäsin uudet funktiot ja exporttasin ne. Enkä jaksanut väsätä type libraryä, mutta näillä vb-koodeilla pitäisi saada importattua:
Koodia: [Valitse]
Private Declare Function vaxfloat2single Lib "libvaxdata.dll" (ByVal Float As Long) As Single
Private Declare Function single2vaxfloat Lib "libvaxdata.dll" (ByVal Float As Single) As Long

Testasin sen verran ettei kaadu ja edestakaisin konvertoidessa tuli sama lopputulos :)

Se dll-tekele on oheisessa tiedostossa.
(en ensin meinannut saada sitä ladattua, mutta onnistuikin sitten muokkaa toiminnolla)
« Viimeksi muokattu: 11.04.16 - klo:19.22 kirjoittanut retu »

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11481
    • Profiili
    • Tomin kotisivut
Vs: VAX/VMS date PC-muotoon?
« Vastaus #12 : 11.04.16 - klo:20.29 »
Jaahas, tämä muuttikin tänne. No, onhan tämä vaxin päiväysten ja numeroiden ihmettely luonnollisesti melkoisen yleishyödyllistä keskustelua. Eikä mitenkään liippaa vaikkapa ohjelmointiin. :P

Syy on siinä, ettei tämä liity Ubuntun käyttöön millään tasolla. Ainakaan sikäli kun minä näen. Ympäristönä on Windows ja VAX ei myöskään liity Ubuntuun.
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

New_user

  • Käyttäjä
  • Viestejä: 1247
    • Profiili
Vs: VAX/VMS date PC-muotoon?
« Vastaus #13 : 02.05.16 - klo:08.45 »
Jaahas, tämä muuttikin tänne. No, onhan tämä vaxin päiväysten ja numeroiden ihmettely luonnollisesti melkoisen yleishyödyllistä keskustelua. Eikä mitenkään liippaa vaikkapa ohjelmointiin. :P

Kaivoin tänään töissä esiin vanhan pölynimurini, jossa visual studio 6, ja tarjosin noita libvaxdata koodeja sille. Vähän piti kyllä kopistella pölyjä myös omasta pääkopasta että mites nämä dll-jutut nyt c-kielellä menikään. En uskaltanut ronkkia niitä valmiita koodeja, joten lisäsin uudet funktiot ja exporttasin ne. Enkä jaksanut väsätä type libraryä, mutta näillä vb-koodeilla pitäisi saada importattua:
Koodia: [Valitse]
Private Declare Function vaxfloat2single Lib "libvaxdata.dll" (ByVal Float As Long) As Single
Private Declare Function single2vaxfloat Lib "libvaxdata.dll" (ByVal Float As Single) As Long

Testasin sen verran ettei kaadu ja edestakaisin konvertoidessa tuli sama lopputulos :)

Se dll-tekele on oheisessa tiedostossa.
(en ensin meinannut saada sitä ladattua, mutta onnistuikin sitten muokkaa toiminnolla)

Todella paljon kiitoksia!!! Tämä oli suoranainen hyväntekeväisyysteko! 
Minunkin pitää joku pölynimuri pystyttää jossa oli VB6, mutta eiköhän se järjesty. Muistaakseni tuossa entisessä skannerikoneena toimivassa on kaikki vielä tallella. 

New_user

  • Käyttäjä
  • Viestejä: 1247
    • Profiili
Vs: VAX/VMS date PC-muotoon?
« Vastaus #14 : 26.05.16 - klo:10.25 »
No niin. Ensimäinen VAX-tiedosto konvertoitu onnistuneesti ascii-muotoon Excel-kelpoiseksi (turvallisin vaihtoehto), ja kyllä ne VAX F-FLOATIT kääntyivät hienosti tuolla dll:llä ja annetut declare-lauseet ohjelmaan liitettyinä.
Olennaista oli syöttää siis kyseinen F-FLOAT long integerinä funktiolle, jolloin palautus pc-singlenä tuli takaisin :)

Todella paljon kiitoksia vaivannäöstä Retu. Olisi tuopin tai muutaman paikka. Samoin nm sen libvaxdatan löytämisestä. :)
« Viimeksi muokattu: 26.05.16 - klo:10.28 kirjoittanut New_user »