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-Key: 118636

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

Printed on: April 23, 2024 at 22:04 o'clock

Member: bastla
bastla Jun 20, 2009 at 16:12:06 (UTC)
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
Member: jutzin
jutzin Jun 20, 2009 at 19:25:59 (UTC)
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