Kurze Erklärung bzgl. JavaScript

02/04/2016 12:18 Kraizy​#1
Moin,

kann mir jemand kurz sagen, was genau "& 255" und "<< 8" in dieser Zeile macht?

PHP Code:
(strVar.charCodeAt(intIndex) & 255) << 
Muss es nämlich in .NET umprogrammieren.
02/04/2016 13:31 Devsome#2
Hoffe das dir das hilft.

Code:
intIndex = 0; // Nimmt das 'd'evsome
strVar = "devsome";
var buffer = (strVar.charCodeAt(intIndex) & 255) << 8;
// 255  Verändert nichts
// 8    8ter Potenz
// Ergebnis ohne die 8 oder mit der 0 = 100
// Zahl |   Ergebnis
// 1    |   200
// 2    |   400
// 3    |   800
// 4    |   1600
// 5    |   3200
// 6    |   6400
// 7    |   12800
// 8    |   25600
alert(buffer);
02/04/2016 14:07 Kraizy​#3
Wenn ich mir die Ergebnisse so anschaue...

PHP Code:
97 
Mit << 8 komme ich auf 24832 -> 97 * 256 = 24832
Klappt mit allen CharCodes. Wenn ich jedoch eines benutze, welches größer als 255 ist, z.B. Ā (CharCode: 256), dann kommt bei alert(buffer); 0 raus.
Das heißt, ich könnte einfach eine If Abfrage machen, ob CharCode > 255 dann einfach 0 setzen, andernfalls einfach mit 256 multiplizieren. Oder irre ich mich da gerade?
02/04/2016 14:13 Devsome#4
Quote:
Originally Posted by Kraizy​ View Post
Wenn ich mir die Ergebnisse so anschaue...

PHP Code:
97 
Mit << 8 komme ich auf 24832 -> 97 * 256 = 24832
Klappt mit allen CharCodes. Wenn ich jedoch eines benutze, welches größer als 255 ist, z.B. Ā (CharCode: 256), dann kommt bei alert(buffer); 0 raus.
Das heißt, ich könnte einfach eine If Abfrage machen, ob CharCode > 255 dann einfach 0 setzen, andernfalls einfach mit 256 multiplizieren. Oder irre ich mich da gerade?
Also ist die 255 für den CharCode index, ist das nicht wonach du dann gesucht hast um es umzubauen :3 ?
02/04/2016 14:33 Kraizy​#5
Naja die gesamte "Funktion" schaut so aus:

PHP Code:
for (var ap 0ap anap++) {
     
ax[ap] = (av.charCodeAt(ap 4) & 255) + ((av.charCodeAt(ap 1) & 255) << 8) + ((av.charCodeAt(ap 2) & 255) << 16) + ((av.charCodeAt(ap 3) & 255) << 24);

Ich wusste halt nicht was die & 255 und << 8 bzw. 16 und 24 auf sich hatten. Und habe soeben erst rausgefunden, dass wenn ich einfach den jeweiligen charCode(index) mit 256 multipliziere, aufs selbe Ergebnisse komme.

PHP Code:
a97
97 
<< 8
//Ergebnis: 24.832

98
98 
<< 8
//Ergebnis: 25.008 
Die selben Ergebnisse bekomme ich wie gesagt auch, wenn ich einfach 97 * 256 bzw 98 * 256 rechne.

Bei << 16 wäre es dann:

PHP Code:
97
97 
<< 16
//Ergebnis: 6.356.992

98
98 
<< 16
//Ergebnis: 6.422.528 
Hier bekomme ich auch wieder die selben Ergebnisse, wenn ich einfach 97 * 65.536 bzw 98 * 65.536 rechne. Die Logik dahinter verstehe ich zwar immer noch nicht, aber wenns so funktioniert, dann lasse ich das einfach so..
02/04/2016 15:02 Devsome#6
d.h Problem gelöst ?

Code:
strVar = "Āpfel";
gibt 0 aus, da der Buchstabe über [Only registered and activated users can see links. Click Here To Register...] liegt.

Man kann es wie du dann schon raus gefunden hast auf 2 Varianten machen.
Würde trotzdem die erste nehmen, somit prüft man ob der Char innerhalb des vorgegeben ISO liegt & berechnet das Ergebnis immer wieder *2 so oft wie die Zahl nach dem << (ich würde mal eine Art for-schleife sagen)

Code:
intIndex = 0; // Nimmt den ersten Buchstaben
strVar = "Āpfel";
var buffer = (strVar.charCodeAt(intIndex) & 255) << 2;
// 255  The ISO-Latin-1 codeset ranges from 0 to 255
// Zahl |   Ergebnis
// 0    |   97
// 1    |   194
// 2    |   388
// 3    |   776
// 4    |   1552
// 5    |   3104
// 6    |   6208
// 7    |   12416
// 8    |   24832
alert(buffer);
02/04/2016 15:07 Kraizy​#7
Quote:
Originally Posted by Devsome View Post
berechnet das Ergebnis immer wieder *2 so oft wie die Zahl nach dem << (ich würde mal eine Art for-schleife sagen)
So könnte man es natürlich auch machen. Und ja, Problem ist anscheinend gelöst :)

Edit: Grad gemerkt, dass ich in .NET genauso einfach "int i = 97 << 8" benutzen kann.. :facepalm:
02/05/2016 11:09 NotEnoughForYou#8
?

Bitwise And mit 255 und shift um 8