jutzin
Goto Top

VBScript - RShift LShift, bitweise Operatoren

Hat jemand einen Schnipsel der RShift(Operand, n bits) und/oder LShift(Operand, n bits) für VBScript implementiert?

Ich nutze ein VBScript, das mittels der ID3Tag.dll Tags von mp3-Dateien ausliest. Die Tags sind offensichtlich UTF-8 kodiert; es entstehen dadurch die typischen Sonderzeichen-Fehlinterpretationen in CP 1252 (z.B. "Ã?" statt "ß" oder "ô" statt "ô"). Das liegt daran, dass Die mehrstelligen UTF-8 Codes als einstellige Hex-Codes interpretiert werden; so ist der UTF-8 Code für "ô" == "C3 B4", dieser wird dann als zwei einstellige Hex-Codes, nämlich "C3" == "Ã" und "B4" == "´" interpretiert.

Bei den Zeichen bis ASCII(127) sind UTF-8 Codierung und Hex(ASCII-Wert) identisch (z.B. ASCII(126) == "~" == Hex "7E" == UTF-8 "7E"), weil einstellig. Bei Zeichen, die mehr als 7 bit lang sind, unterscheiden sich aber die UTF-8 von den Hex-Codes, also kommt es zu dem komischen Kauderwelsch. Es kursieren eine Menge Codeschnipsel, viele davon, um das URL %-Encoding (ohne Server-Objekt) zu realisieren, die man benutzen kann; man kann auch prima die Escape()-Function benutzen, aber leider funktionieren diese Lösungen alle nur bis 8 bit Länge bzw. bis ASCII(255), also dem Ende der Unicode-Tabelle. Kyrillische, arabische, japanische etc. Schriftzeichen haben 3-stellige UTF-8 Codes und werden falsch dargestellt (z.B. wird das japanische Schriftzeichen "?" (sprich: nô) == Hex "306E" == UTF-8 "E3 81 AE" == ASCII(12398) als "の" dargestellt, da dies die ASCII-Darstellung von Hex "E3 81 AE" ist.

Soweit so schlecht. Ich habe also nach einem verlässlichen Algorithmus zum Umwandeln der Zeichen -- jenseits von ASCII(255) -- gesucht und bin auch fündig geworden (am coolsten, weil er wirklich in allen Fällen funktioniert und außerdem zwischen allen möglichen Codierungen hin- und her übersetzen kann ist der von Richard Ishida (JavaScript). Leider beinhalten die Algorithmen, die ich gefunden habe, alle Bitshift-Operationen. Langer Rede kurzer Sinn: Hat jemand sowas -- also Bitshift -- schonmal in VBScript implementiert?

Viele Grüße

jutzin

Content-ID: 118636

Url: https://administrator.de/contentid/118636

Ausgedruckt am: 22.11.2024 um 13:11 Uhr

bastla
bastla 20.06.2009 um 18:12:06 Uhr
Goto Top
Hallo jutzin!

Sollte sich (rotierend) etwa so machen lassen:
'Demo  
X = 8'BitAnzahl  
S = 4'Stellen  
A = 199
B = RShift(A, S , X)
C = LShift(B, S , X)
WScript.Echo A, B, C
WScript.Echo "um " & S & ":", Dec2Bin(A, X), Dec2Bin(B, X), Dec2Bin(C, X)  
WScript.Echo

X = 16
S = 5
A = 65472
B = RShift(A, S, X)
C = LShift(B, S, X)
WScript.Echo A, B, C
WScript.Echo "um " & S & ":", Dec2Bin(A, X), Dec2Bin(B, X), Dec2Bin(C, X)  
WScript.Echo

X = 24
S = 3
A = 16777203
B = RShift(A, S, X)
C = LShift(B, S, X)
WScript.Echo A, B, C
WScript.Echo "um " & S & ":", Dec2Bin(A, X), Dec2Bin(B, X), Dec2Bin(C, X)  

Function RShift(Wert, Stellen, BitAnzahl)
Temp = Wert
For i = 1 To Stellen
    Temp = Int(Temp / 2) + 2 ^ (BitAnzahl - 1) * (Temp Mod 2)
Next
RShift = Temp
End Function

Function LShift(Wert, Stellen, BitAnzahl)
Temp = Wert
For i = 1 To Stellen
    Temp = Temp * 2 + Int(Temp / 2 ^(BitAnzahl - 1))
    If Temp >= 2 ^ BitAnzahl Then Temp = Temp - 2 ^ BitAnzahl
Next
LShift = Temp
End Function

Function Dec2Bin(Wert, BitAnzahl)
Bin = ""  
For i = BitAnzahl - 1 To 0 Step -1
    Bit = Int(Wert / 2 ^ i)
    Wert = Wert - Bit * 2 ^ i
    Bin = Bin & Bit
Next
Dec2Bin = Bin
End Function

Function Bin2Dec(Wert)
Dec = 0
Bits = Len(Wert)
For i = 1 To Bits
    Dec = Dec + 2 ^ (Bits - i) * Mid(Wert, i, 1)
Next
Bin2Dec = Dec
End Function
Grüße
bastla
jutzin
jutzin 20.06.2009 um 21:25:59 Uhr
Goto Top
oh mann, diese forum ist echt das beste. da postet man was, geht zwei stündchen ins theater, kommt zurück und setzt seinen beitrag auf "gelöst". besten dank!

jutzin