Goedemorgen,

Ik ben me ervan bewust dat dit misschien niet echt thuishoort op PhpHulp, maar omdat ik dit wel wil aanroepen/gebruiken vanuit PHP en de hoop/verwachting dat hier mensen zijn die hier ervaring mee hebben toch hier de vraag:

Het gaat om een C# script dat te vinden is op GitHub, dit zijn verschillende .cs-bestanden die .ddd/.esm-bestanden (tachograaf-tachograaf- en chauffeurskaartbestanden in binary formaat) kunnen omzetten naar XML. Deze bestanden zijn 3 jaar oud maar iets recenters heb ik helaas nog niet gevonden. De standaard voor deze bestanden is veel ouder dus wat dat betreft zou dit hopelijk niet uit moeten maken.

Wat ik wil bereiken is het volgende: meerdere van deze .ddd/.esm-bestanden zullen geüpload gaan worden naar een server en vanuit deze map moeten ze ingelezen gaan worden naar een database. De data uit deze bestanden bevat onder andere diverse datumvelden en ik wil bijvoorbeeld inzichtelijk maken of er van een bepaald voertuig of chauffeur alle data beschikbaar is of dat zich hierin gaten in de historie bevinden. Van elk voertuig en kaart wordt namelijk periodiek zo'n bestand gemaakt maar aan de buitenkant is niet te zien welke data hierin zit.
Elk bestand met de hand controleren is zoals je zal begrijpen niet echt een optie.

De basisvraag is eigenlijk heel simpel: hoe krijg je .cs-bestanden werkend op een (in mijn geval bij voorkeur) CentOS-server? Ik kan met Linux/CentOS en PHP aardig overweg maar van C# heb ik echt geen kaas van gegeten.
Ik heb al gelezen over compilen en Mono maar ik ben echt een leek wat dit betreft. Is er iemand die mij op weg wil en kan helpen?


Voor wie zich verveelt: het tachograaf bestandsformaat, download protocol, en praktisch alle over digitale tachografen staat beschreven in http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=CONSLEG:2002R1360:20020825:NL:PDF
Ik ben niet zo bekend met C#, maar volgens mij is dit niet voor Linux geschreven, maar uitsluitend voor Windows. Op haast alles wat ik tegenkom lees ikw at over het .Net Framework wat typisch iets van Microsoft is.
Je kunt met mono aan de slag, specifiek mod_mono wanneer je iets op het internet wil gebruiken. Maar gezien de hoeveelheid code ben je waarschijnlijk sneller klaar als je de code gewoon port naar bijvoorbeeld php.
"Gewoon porten naar PHP" klinkt erg goed :)
Alleen zou ik daar ook een beetje hulp bij nodig hebben...
Wie helpt mij verder?

<?php

$vFile = file_get_contents('bestand.esm');

$aResult = array();
for($l=strlen($vFile), $i=0; $i<$l; $i++)
{
	$aResult[] = ord($vFile[$i]);
}

/* Output:

Array
(
    [0] => 0
    [1] => 2
    [2] => 0
    [3] => 0
    [4] => 25
    [5] => 0
    [6] => 0
    [7] => 6
    [8] => 110
    [9] => 174
    [10] => 17
    [11] => 17
    [12] => 1
    [13] => 48
    [14] => 78
    [15] => 76
    [16] => 68
    [17] => 84
    [18] => 95
    [19] => 50
    [20] => 107
    [21] => 57
    [22] => 48
enz.
*/ ?>


Echter als ik met chr() deze value's wil omzetten naar leestekens dan blijft het resultaat blanco.
Als ik chr(85) rechtstreeks doe dan wordt er wel een U weergegeven bijvoorbeeld. Is er een reden voor waarom dit met variabelen niet lukt? Kan iemand mij een manier adviseren hoe ik werkend kan krijgen?
Als ik $vFile[$i] zelf probeer te returnen blijft deze ook blanco en met chr($vFile[$i]) rechtstreeks ook.
Ik heb nooit eerder met de functies ord() en chr() gewerkt, verwacht ik een output die nooit komt?
Is er een manier om $vFile[$i] om te zetten naar een 'normaal' leesteken? Zoals hierboven te zien worden er verschillende karakters herkend maar waarom blijven deze bij chr() of bij rechtstreekse benadering leeg?
Zijn de bestanden uberhaupt wel zinvol te openen? Ik lees dit hierover:
Deze bestanden hebben een standaard format “.ddd of .esm”. Beide wettelijk goedgekeurde bestanden. Deze bestanden zijn heel erg goed beveiligd tegen fraude. Het is daarom niet mogelijk deze te openen op uw computer zonder speciale software zoals RS DigiTac?? http://www.rs-roadsoft.nl/uploads/Handleiding%20RS%20DigiTac%20-%20Digitale%20Tachograaf%20Software.pdf
Met C# is het in ieder geval te doen (zie hierboven) dus er is ongetwijfeld een manier.
Ik heb even bij wijze van 'quick-and-dirty oplossing' de volgende array gemaakt omdat ik met chr() geen resultaat krijg:

$aASCII = array(
...
	10 => '<br />',
...
	32 => ' ',
	33 => '!',
	34 => '\"',
	35 => '#',
	36 => '$',
	37 => '%',
	38 => '&',
	39 => '\'',
	40 => '(',
	41 => ')',
	42 => '*',
	43 => '+',
	44 => ',',
	45 => '-',
	46 => '.',
	47 => '/',
	48 => '0',
	49 => '1',
	50 => '2',
	51 => '3',
...
	56 => '8',
	57 => '9',
	58 => ':',
	59 => ';',
	60 => '<',
	61 => '=',
	62 => '>',
	63 => '?',
	64 => '@',
	65 => 'A',
	66 => 'B',
	67 => 'C',
	68 => 'D',
...
	88 => 'X',
	89 => 'Y',
	90 => 'Z',
	91 => '[',
	92 => '\\',
	93 => ']',
	94 => '^',
	95 => '_',
	96 => '`',
	97 => 'a',
	98 => 'b',
	99 => 'c',
	100 => 'd',
	101 => 'e',
	102 => 'f',
	103 => 'g',
	104 => 'h',
	105 => 'i',
	106 => 'j',
... 
enz.

Als ik hier de waardes uit $aResult tegenaan zet dan krijg ik heel veel te zien, onder andere kentekens, chauffeurnaam, standplaats en heel veel dat ik nog niet kan ontcijferen. Om je vraag te beantwoorden: het lijkt dus zeker wel zinvol. Ik vermoed dat chr() een bepaald teken o.i.d. als output geeft dat een conflict oplevert waardoor het resultaat blanco blijft, zou dat kunnen?
De reden dat chr() praktisch geen output geeft is doordat je voor het overgrote deel nonprintable characters etc hebt, die uiteraard deel zijn van het formaat. Wat je in het aangehaalde C# script ziet is dat bestanden worden gelezen als bytestream, op zoek gegaan wordt naar kengetallen (de magics) en op basis hiervan actie wordt ondernomen. Het is hoe dan ook niet zinvol om esm bestanden gewoon te outputten, daar kom je niet verder mee.

Het ziet er allemaal op het oog niet heel complex uit, ik heb alleen geen voorbeeldbestand om eens een kijkje te nemen.
Ik stuur je e.e.a. toe via de mail Ben!

Reageren