PHP: Integer zu Upper 4 Bytes und Lower 4 Bytes

  • In der Musikdatenbank von Kodi gibt es die Tabelle "song". Darin gibt es das Feld "iTrack". Das ist ein Integer-Wert, z.B. "851969". In diesem Wert ist die DiskNummer (upper 4 bytes) und die TrackNummer (lower 4 bytes) gespeichert.

    Wie bekomm ich diesen Integer-Wert mit php konvertiert in Disknummer und Tracknummer?

    Schöne Grüße

  • Code
    $intval = 851969;
    
    
    $low = $intval & 0xff;
    $high = ($intval >> 8) & 0xff;

    Ich kenne zwar kein PHP, aber in C oder C++ oder Java würde dieser Code das low byte und das zweite byte von unten extrahieren, nicht aber, wie im Titel " Integer zu Upper 4 Bytes und Lower 4 Bytes". Würde mich sehr wunderen, wenn das in PHP anders wäre-

    Wenn

    $high = ($iTrack >> 8)/ 256;

    das funktioniert, benötigst du vermutlich die unteren 2 bytes und die oberen 2 bytes, und nicht wie im Titel 4 bytes? Ich weiß jetzt nicht wie lange Integer sind, bei PHP. Vermutlich willst du dann sowas:

    Code
    $intval = 851969;
    $low = $intval & 0xffff;
    $high = ($intval >> 16) & 0xffff;


    Extrahiert einmal bytes 1 und 2, einmal bytes 3 und 4. Also Integer zu Upper 2 Bytes und Lower 2 Bytes

    Kodi 21.0, 17.6, 20.5, 16, 20.5 on Windows 11 Pro, Android 6, Android 12, FireTV Box 2nd Gen, FireTV 4k Max 2nd Gen
    Media on NAS, OpenMediaVault 6 (Debian Linux).

  • danke für deine Antwort.

    das mit den 4 Byte hab ich von hier:
    https://kodi.wiki/view/Databases/MyMusic#song

    Code
    $high = ($intval >> 16) & 0xffff;

    das funktioniert übrigens. Danke.


    Code
    $high = ($intval >> 16) & 0xff;

    das funktioniert übrigens auch, hatte ich am Anfang falsch abgeschrieben.


    Das ganze Thema schau ich mir irgendwann nochmal genauer an, aber jetzt hab ich ja 3 Lösungen, die erstmal funktionieren. Danke

  • das mit den 4 Byte hab ich von hier:
    http://kodi.wiki/view/Databases/MyMusic#song

    Ja, da steht: "Song disc (upper 4 bytes) and track number (lower 4 bytes)". Scheint nach dem von dir gesagten (dass es halt mit Rechtsshift um 16 bit das erwartete Ergebnis erhält) ein offensichtlicher Tippfehler, und es müsste wohl heißen: "Song disc (upper 2 bytes) and track number (lower 2 bytes)" [Ohne dasss ich jetzt nachgesehen habe, wie breit die Integer da wirklich sind].

    Dann gibt es schon noch einen Unterschied zwischen der &0xffff und der &0xff Version. $intval sei in hexadezimal 0x01020304.  $high = ($intval >> 16) & 0xff; liefert als Ergebnis 0x02 = 2, $high = ($intval >> 16) & 0xffff; liefert als Ergebnis 0x0102, was dezimal 258 sind. Da (wenn ich das richtig interpretiere) es wohl kaum eine Songdisc# > 256 geben wird, wirst du praktisch keinen Unterschied feststellen, von der Beschreibung wäre aber das &0xff formal nicht korrekt.

    (Das &0xffff könnte man wahrscheinlich ganz weglassen - aber da können Subtilitäten wie negative Integer und Sign-Extension bei Rightshift ne Rolle spielen)

    Kodi 21.0, 17.6, 20.5, 16, 20.5 on Windows 11 Pro, Android 6, Android 12, FireTV Box 2nd Gen, FireTV 4k Max 2nd Gen
    Media on NAS, OpenMediaVault 6 (Debian Linux).

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!