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.
Bei den Zeichen bis
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 118636
Url: https://administrator.de/forum/vbscript-rshift-lshift-bitweise-operatoren-118636.html
Ausgedruckt am: 22.12.2024 um 19:12 Uhr
2 Kommentare
Neuester Kommentar
Hallo jutzin!
Sollte sich (rotierend) etwa so machen lassen:
Grüße
bastla
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
bastla