Normalen Intenger in Synchsafe Integer konvertieren

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Infinity.

    Normalen Intenger in Synchsafe Integer konvertieren

    Hi,

    ich denke die Überschrift sagt eigentlich schon mein Problem.

    Hier die Definition eines Synchsafe Integers:

    Synchsafe integers are
    integers that keep its highest bit (bit 7) zeroed, making seven bits
    out of eight available. Thus a 32 bit synchsafe integer can store 28
    bits of information.

    Example:

    255 (%11111111) encoded as a 16 bit synchsafe integer is 383
    (%00000001 01111111).


    Ich habe bereits folgende Funktion für die andere Richtung:

    VB.NET-Quellcode

    1. Public Shared Function SynchsafeIntToNormalInt(ByVal Value As UInteger) As UInteger
    2. Return (Value And &H7FUI) Or (Value And &H7F00UI) >> 1 Or (Value And &H7F0000UI) >> 2 Or (Value And &H7F000000UI) >> 3
    3. End Function


    Aber beim Konvertieren in einen Synchsafe Integer stehe ich gerade auf dem Schlauch. Hier habe ich bereits folgende Funktion, die aber meiner Meinung nach, alles andere als optimal ist:

    VB.NET-Quellcode

    1. Public Shared Function NormalIntToSynchsafeInt(ByVal Value As UInteger) As UInteger
    2. Dim Res As UInteger
    3. Dim CurrentDestBit As UInteger
    4. For CurrentSourceBit As UInteger = 0 To 31
    5. If CurrentSourceBit Mod 7 = 0 Then CurrentDestBit += 1UI
    6. SetBit(Res, GetBit(Value, CurrentSourceBit), CurrentDestBit)
    7. CurrentDestBit += 1UI
    8. Next
    9. Return Res
    10. End Function
    11. Public Shared Sub SetBit(ByRef Source As UInteger, ByVal Value As Boolean, ByVal Index As UInteger)
    12. If Value Then
    13. Index = CUInt(2 ^ Index)
    14. Source = Source Or Index
    15. Else
    16. Index = Not CUInt(2 ^ Index)
    17. Source = Source And Index
    18. End If
    19. End Sub


    Wäre nett wenn ihr mir helfen könntet.
    dulieberHimmel! Wer denkt sich denn solche Gemeinheiten aus, und zu welchem Zweck?

    also folgender Plan:
    Betrachte den UInteger als 4 einzelne Bytes.

    Das erste Byte wird um 3 geshiftet.
    vom 2. Byte werden die 3 oberen Bits auf die frei gewordenen bits des ersten Bytes kopiert.

    Das 2. Byte wird um 2 geshiftet
    Vom 3.Byte werden die 2 oberen Bits auf die frei gewordenen bits des 2. Bytes kopiert.

    Das 3. Byte wird um 1 geshiftet
    Vom 4.Byte wird das obere Bits auf das frei gewordene bit des 3. Bytes kopiert.

    Das 4. Byte wird nicht geshiftet, sondern nur das obere Bit wegmaskiert.

    mit System.Buffer.BlockCopy() kann man ein UInteger-Array mit nur einem Element auf ein 4-Byte-Array kopieren und zurück.

    Fiel Fergnügen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Danke für die Antwort. Werde es mal mit einzelnen Bytes probieren.

    Ach ja, wer denkt sich sowas aus? Die Entwickler des ID3-Standards.

    Zweck: MP3-Dateien bestehen aus Frames. Vor jedem Frame befinden sich 11 Bits, die auf 1 gesetzt sind. Dran kann dann z. B. ein Player erkennen, dass jetzt ein Frame folgt.
    Im ID3 Standard verwendet man deshalt Synchsafe Integer, damit es nicht passieren kann, dass 11 Bits die auf 1 gesetzt sind in einem Integer sind und ein Player dann versuchen würde die nachfolgenden Bytes als Frame zu interpretieren.

    EDIT: Bin jetzt selbst auf die richtige Funktion gekommen:

    VB.NET-Quellcode

    1. Public Shared Function NormalIntToSynchsafeInt(ByVal Value As UInteger) As UInteger
    2. Return (Value And &H7FUI) Or (Value And &H3F80UI) << 1 Or (Value And &H1FC000UI) << 2 Or (Value And &HFE00000UI) << 3
    3. End Function

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Infinity“ ()