php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 10-07-2015, 19:00
Akira
 Registrierter Benutzer
Links : Onlinestatus : Akira ist offline
Registriert seit: Nov 2003
Beiträge: 43
Akira ist zur Zeit noch ein unbeschriebenes Blatt
Standard pack() Funktion anhand eines Beispiels

Hi

bis jetzt hatte ich mit pack() noch nichts zu tun und verstehe leider nichts. Komme dementsprechend auch keinen Millimeter weiter.

Ich habe hier ein Dokumentation in der folgendes steht:
Code:
This 40-bit field contains the start time of the event in Universal Time, Co-ordinated (UTC) and Modified
Julian Date (MJD) (see annex C). This field is coded as 16 bits giving the 16 LSBs of MJD followed by 24 bits coded as
6 digits in 4-bit Binary Coded Decimal (BCD). If the start time is undefined (e.g. for an event in a NVOD reference
service) all bits of the field are set to "1".
EXAMPLE 1: 93/10/13 12:45:00 is coded as "0xC079124500".
Ich versuche das Beispiel nachzuvollziehen und zu codieren. Aber ich komme nicht mal in die Nähe aus "93/10/13 12:45:00" das entsprechende Ergebnis zu erzielen.

Kann mir bitte jemand erklären wie das gemacht wird?
Mit Zitat antworten
  #2 (permalink)  
Alt 10-07-2015, 20:21
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.604
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
(see annex C)
Was steht dort?
Mit Zitat antworten
  #3 (permalink)  
Alt 11-07-2015, 03:36
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Akira Beitrag anzeigen
Code:
EXAMPLE 1: 93/10/13 12:45:00 is coded as "0xC079124500".
Aber ich komme nicht mal in die Nähe aus "93/10/13 12:45:00" das entsprechende Ergebnis zu erzielen.
Na die Uhrzeit 12:45:00 solltest du da ja relativ leicht wiederfinden, wenn du mal scharf hinschaust – 124500 am Ende des Wertes.

Modified Julian Date ist das „normale“ Julianische Datum, minus 2400000.5 – siehe Wikipedia, https://en.wikipedia.org/wiki/Julian_day#Variants

cal_to_jd gibt dir das Julianische Datum, für den 13.10.1993 ist das 2449274, in MJD also 49273.5.

Und wenn du auf diese Zahl mal dechex() anwendest, erhältst du: c079
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #4 (permalink)  
Alt 11-07-2015, 08:51
Akira
 Registrierter Benutzer
Links : Onlinestatus : Akira ist offline
Registriert seit: Nov 2003
Beiträge: 43
Akira ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Meine Konzentration ist in letzter Zeit nicht besonders gut. Das die Uhrzeit einfach so angehängt wird habe ich nicht gesehen.

Weiters habe ich jetzt die ganze Zeit versucht das Datum aus dem Julianischen Kalender in einen "Julian Day Count" zu verwandeln, funktioniert natürlich nicht.
Wenn ich vom Gregorianischen Kalender ausgehe klappt es plötzlich

Viellen Dank. Mal sehen ob ich den Rest vielleicht selbst schaffe
Mit Zitat antworten
  #5 (permalink)  
Alt 11-07-2015, 09:35
Akira
 Registrierter Benutzer
Links : Onlinestatus : Akira ist offline
Registriert seit: Nov 2003
Beiträge: 43
Akira ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Jetzt bin ich ja wirklich weitergekommen

Allerdings stehe ich vor einem neuen Problem. mit pack() kann ich nicht direkt 24 bit oder 40 bit packen.
Kann ich das irgendwie teilen (24 bit = 3x8bit) oder ähnliches?
Mit Zitat antworten
  #6 (permalink)  
Alt 11-07-2015, 12:50
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Was für ein Format brauchst du denn letztendlich?

Das Beispiel zeigt ja nur einen Hex-String, bzw. eine Zahl in hexadezimaler Notation.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #7 (permalink)  
Alt 15-07-2015, 13:27
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von h3ll;
Was steht dort?
Neben einer wenig nützlichen Grafik hauptsächlich Formeln, die zeigen, wie man zwischen beiden Datums-Formaten hin- und herkonvertiert: Auf den Seiten 71 + 72. Aber wenn du da jetzt nachschaust, verdirbst du dir den ganzen Ratespaß.

Die aktuelle Version gibts unter Work Programme - Work Item Detailed Report. Leider fehlen dort die schönen Formeln.

Zitat:
Zitat von wahsaga;
Was für ein Format brauchst du denn letztendlich?
Vermutlich Timestamps für EPG.

Zitat:
Zitat von Akira Beitrag anzeigen
Jetzt bin ich ja wirklich weitergekommen

Allerdings stehe ich vor einem neuen Problem. mit pack() kann ich nicht direkt 24 bit oder 40 bit packen.
Kann ich das irgendwie teilen (24 bit = 3x8bit) oder ähnliches?
Kannst du. Pack() kann Bytes einzeln setzen. Bspw.: so:
PHP-Code:
pack('CCC'$var0$var2$var3); 
Allerdings spricht der Informationsfetzen, den du zitierst, von BCD-Kodierung. Das sind Zahlen von 0 bis 10 in "halben Bytes", keine ganzen. Schau dir zum Vergleich und zur Ideen-Findung mal an, wie das in Perl gelöst wird. Perls pack-Funktion (siehe auch) funktionert ähnlich wie die in PHP.

Update: Wenn man die Uhrzeit passend formatiert aus einem DateTime-Objekt herauszieht, kann man pack() direkt damit füttern:
PHP-Code:
pack('nH6'0xffff $mjdaycount$dt->format('His')); 
Das ist zwar nicht ganz die feine englische Art, weil 'H' eigentlich dafür da ist, Hex-Ziffern (0-9,A-F) in Halfbytes zu quetschen, aber es funktioniert hier, weil die Ziffern in korrekten Tageszeitangaben im entsprechenden Rahmen bleiben.

'n' belegt hier zwei Bytes (16 Bit).
'H6' nimmt sich 6 halbe Bytes, also 3 ganze (24 Bit)

PHP: pack - Manual

Den Rückgriff auf Formeln zur Berechnung des MJD kann man sich auch sparen, wenn man das Epochen-Datum des MJD kennt ("1858-11-17T00:00:00"):
PHP-Code:
$epoch = new DateTime('1858-11-17T00:00:00', new DateTimeZone('UTC'));
$datetime = new DateTime(...);
$mjdaycount $datetime->diff($epoch)->days
Dann gibts auch keine Verwirrung mit den Kalendertypen, denn DateTime und DateInterval (das von ->diff() geliefert wird) können nur "gregorianisch".

PHP: DateTime - Manual
PHP: DateTime::format - Manual
PHP: date - Manual (erklärt die Format-Templates)
PHP: DateTime::diff - Manual
PHP: DateInterval - Manual

Geändert von fireweasel (15-07-2015 um 16:46 Uhr) Grund: typo + ergänzungen
Mit Zitat antworten
  #8 (permalink)  
Alt 18-07-2015, 19:39
Akira
 Registrierter Benutzer
Links : Onlinestatus : Akira ist offline
Registriert seit: Nov 2003
Beiträge: 43
Akira ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke dir für deine Mühe, fireweasel.

Hab deinen Beitrag mal überflogen, hab aber erst in ein paar Wochen wieder Zeit hier weiterzumachen.
Mit Zitat antworten
  #9 (permalink)  
Alt 27-07-2015, 12:26
Akira
 Registrierter Benutzer
Links : Onlinestatus : Akira ist offline
Registriert seit: Nov 2003
Beiträge: 43
Akira ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Nochmals Danke für deine Mühe fireweasel.

Aber ich begrabe das Projekt zum zweiten Mal. Diesmal endgültig. Ich habe einfach nicht die Geduld und die Zeit mich da reinzudenken. Vielleicht werde ich alt . Genug gejammert.

Gibt es eine php Klasse die ich nur mehr einbinden muss? Ja ich habe deinen Link gesehen und heruntergeladen. Aber ich habe nicht geschafft diese perl Klasse zum Laufen zu bekommen. Habe mich mit perl auch noch nie beschäftigt und werde damit auch nicht anfangen.

Wenn es keine fertige PHP Klasse gibt habe ich halt Pech gehabt und werde darauf verzichten.
Mit Zitat antworten
  #10 (permalink)  
Alt 28-07-2015, 13:08
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von Akira Beitrag anzeigen
Ja ich habe deinen Link gesehen und heruntergeladen. Aber ich habe nicht geschafft diese perl Klasse zum Laufen zu bekommen. Habe mich mit perl auch noch nie beschäftigt und werde damit auch nicht anfangen.
Das Perl-Modul war nur als Inspirationsquelle gedacht (weil es in PHP derzeit nichts vergleichbares gibt). Es kodiert und dekodiert EIT-Strukturen (bspw. die in MPEG-Streams oder -Dateien) und nutzt dazu u.A. pack() und unpack(). Beide Perl-Funktionen waren das Vorbild, nach dem PHP's pack() und unpack() geschaffen wurden. Aber nicht so wichtig.

Mir ist noch immer nicht ganz klar, worauf du eigentlich hinauswolltest:
- die EIT-Struktur kodieren und dekodieren?
- pack() und unpack() verstehen lernen?
Ersteres geht auch ohne letzeres, wie du in diesem Thread hier an wahsagas Beiträgen gut sehen kannst. Wenn dir diese Vorgehensweise mehr liegt, als dich in komische Format-Codes einzuarbeiten, ist das vollkommen in Ordnung.

Zitat:
Zitat von Akira Beitrag anzeigen
Gibt es eine php Klasse die ich nur mehr einbinden muss?
Ich hatte da was gebastelt, weiß aber nicht, ob es deinen Ansprüchen genügt:
PHP-Code:
/*
Encode + decode the start_time structure in Event Information Tables as given in
http://www.etsi.org/deliver/etsi_en/300400_300499/300468/01.14.01_60/en_300468v011401p.pdf
ETSI EN 300 468 V1.14.1 (2014-05) Section 5.2 Table definitions (page 29)
*/
class EitStartTime {
    
/// get the epoch (base date) for the MJD
    /// return obj(DateTime::)
    
static function epoch() {
        static 
$epoch null;
        if (
null === $epoch) {
            
$epoch = new DateTime('1858-11-17T00:00:00', new DateTimeZone('UTC'));
        }
        return clone 
$epoch;
    }

    const 
UNDEFINED "\xff\xff\xff\xff\xff"// all bits set

    /// get start_time from the EIT table
    /// return str() binary data
    
static function encode(DateTimeInterface $dt null) {
        if (
null === $dt) {
            return 
self::UNDEFINED;
        }
        return 
pack(
            
'nH6',
            
0xffff $dt->diff(self::epoch())->days// truncated (c)mjd
            
$dt->format('His'// time of day
        
);
    }

    
/// build DateTime object from encoded binary string
    /// return obj(DateTime::)|null()
    
static function decode($packed) {
        if (
self::UNDEFINED === $packed) {
            return 
null;
        }
        if (
strlen($packed) < 5) {
            throw new 
Exception('binary string must contain at least 5 bytes');
        }
        
$struct = (object) unpack(
            
'ndays/H*time'// unpack formats suck
            
substr($packed05)
        );
        
$dt self::epoch(); // cloned
        
if (
            !
$dt->modify('+' $struct->days 'days') || // add days since MJD epoch
            
!$dt->modify('T' $struct->time// set timeofday
        
) {
            throw new 
Exception('invalid binary string given');
        }
        return 
$dt;
    }

::encode() macht aus einem DateTime- oder DateTimeImmutable-Objekt einen Binärstring, den man prinzipiell direkt in die EITable schreiben kann. Wenn man es mit dem Wert NULL füttert, liefert es den speziell kodierten ::UNDEFINED-String.

::decode() wandelt den Binärstring wieder in ein DateTime-Objekt. Aus dem speziellen ::UNDEFINED-String macht es NULL.

Ein einfacher Test mit dem üblichen Beispiel-Zeitstempel und zwei Werten, die als ::UNDEFINED erkannt werden sollen, hat zumindest bei mir funktioniert:

PHP-Code:
$tests = array (
    
'1993-10-13T12:45:00+00:00',
    
null,
    
'-'
);

foreach (
$tests as $test) {
    try {
        
$dt = new DateTime($test);
    }
    catch (
Exception $ex) {
        
$dt null;
    }
    
$enc EitStartTime::encode($dt);
    
var_dump(current(unpack('H*'$enc))); // als Hex-String
    
$dec EitStartTime::decode($enc);
    
var_dump($dec); // als Datums-Objekt oder NULL
    //Error::writefln('enc: %S dec: %S', current(unpack('H*', $enc)), $dec);

Mit Zitat antworten
  #11 (permalink)  
Alt 30-07-2015, 11:09
Akira
 Registrierter Benutzer
Links : Onlinestatus : Akira ist offline
Registriert seit: Nov 2003
Beiträge: 43
Akira ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich bin es nicht gewöhnt das mir solche Code Schnippsel vorgebetet werden

Ich mache trotzdem nicht weiter. Ist mir zu Zeitaufwändig. Dieses bit-weise packen hab ich noch nie gemacht und ich habs immer noch nicht vollsändig verstanden....

Worauf ich hinaus will?
Ich habe eine Film Datenbank. Erstellt mit PHP. Nicht gerade die Programmiersprache (Skriptsprache) der Wahl aber die einzige die ich kann. Außerdem stand da (vor ca. 4 Jahren) der Spaß am coden im vordergrund.

Jetzt wollte ich in meine Film Datenbank noch die Möglichkeit implementieren Norm-konforme .eit Dateien zu erstellen damit die enigma2 Box mir eine Inhaltsanagabe der Aufnahmen anzeigt. Mit Short Description, Extendes Description usw.

Aber wie gesagt, ist es mir neben meinem Vollzeitjob und Familie einfach zu zeitaufwändig. Bis ich mir da alles was ich brauche erarbeitet habe vergehen Tage...
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Anhand eines Pixels ein bestimmtes Bild anzeigen... Adamcos PHP Developer Forum 3 06-08-2010 14:52
kann mir jemand bitte preg_replace anhand des praktischen Beispiels erklären? icecoldkilla PHP Developer Forum 10 17-06-2010 00:29
[PHP5] string anhand eines zeichen zerstückeln UzumakiNaruto PHP Developer Forum 8 13-01-2009 22:59
Array anhand eines Musterarrays sortieren nikothome PHP Developer Forum 2 16-08-2005 10:54
[Funktion] pack ghostgambler PHP Developer Forum 4 06-04-2005 17:57

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni


 

Aktuelle PHP Scripte

HeidiSQL - kostenloses MySQL front-end Editor für Windows ansehen HeidiSQL - kostenloses MySQL front-end Editor für Windows

HeidiSQL - ist ein Windows-Editor für die bekannt open Source Datenbank mySQL

10.12.2018 Berni | Kategorie: MYSQL/ Management
piwik Open-Source Webanalyse-Software ansehen piwik Open-Source Webanalyse-Software

piwik ist eine gute Alternative zu Google Analytics. Viele Features und ein modernes Erscheinungsbild mit aussagefähigen Statistiken in Echtzeit

10.12.2018 phpler | Kategorie: PHP/ Besucherzaehler
jQuery Mobile ansehen jQuery Mobile

Touch-Optimized Web Framework für Smartphones & Tablets

09.12.2018 phpler | Kategorie: AJAX/ Framework
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 06:14 Uhr.