Schrift
[thread]2206[/thread]

Hexadezimale Codierung

Leser: 1


<< >> 10 Einträge, 1 Seite
[E|B]
 2004-05-31 18:24
#25722 #25722
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
HiHo!
Wie kann ich einen beliebigen String in JS als hexadezimale Zeichenfolge codieren?
In Perl erledigt das unpack("H*", $string) für mich...
Wie geht das in JS?
Es sollen v.a. auch Strings codiert werden.
Danke!
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
esskar
 2004-05-31 19:20
#25723 #25723
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
versuch mal:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function StringToHexString(str)
{
var retval = "";

var cbdata = str.length;
if(cbdata > 0)
{
var i = 0;
while(cbdata--)
{
var b = (str.charCodeAt(i) & 0xF0) >> 4;
retval += (b <= 9) ? String.fromCharCode(b + 48) : String.fromCharCode((b - 10) + 65);
b = str.charCodeAt(i) & 0x0F;
retval += (b <= 9) ? String.fromCharCode(b + 48) : String.fromCharCode((b - 10) + 65);
i++;
}
}

return retval;
}
[E|B]
 2004-05-31 21:29
#25724 #25724
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Boah, Sahne!
Funtzt! :D

Kannst du mir den Snippet kurz erklären?
Insbesondere diese Zeilen:

Code: (dl )
1
2
3
4
var b = (str.charCodeAt(i) & 0xF0) >> 4;
retval += (b <= 9) ? String.fromCharCode(b + 48) : String.fromCharCode((b - 10) + 65);
b = str.charCodeAt(i) & 0x0F;
retval += (b <= 9) ? String.fromCharCode(b + 48) : String.fromCharCode((b - 10) + 65);
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
renee
 2004-06-01 01:44
#25725 #25725
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Quote
var b = (str.charCodeAt(i) & 0xF0) >> 4;

charCodeAt() gibt eine 16-bit lange Zahl zurück, die den Unicodewert des Zeichens angibt.
Diese wird bitweise mit 0xF0 (= 240 dezimal, wenn ich mich nicht verrechnet habe) mit UND verknüpft.
Das Ergebnis wird dann um 4 Stellen nach rechts geshiftet.

Beispielrechnung:

1.) charCode = 105d
2.) 0xF0 = 240d


1) 0000 0000 0110 1001b
2) 0000 0000 1111 0000b

&
0000 0000 0110 0000b

>> 4
0000 0000 0000 0110b
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
[E|B]
 2004-06-01 22:40
#25726 #25726
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hmmm... OK. Diese Operatoren wie & und >> sind mir nicht gängig. Hab noch nie damit gearbeitet.
& verkettet also einen String? >> verschiebt ihn bitweise? Klar, das hab ich jetzt aus dem Lehrbuch...
Könnte mir jemand ein ganz einfaches Beispiel anhand von einem normalen String geben? Oder geht das nur mit Zahlen? *verwirr*
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
esskar
 2004-06-01 23:05
#25727 #25727
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hi...

also, dann machen wir mal ein bsp.

StringToHexString("Hallo")

zu Beginn ist i = 0:
=> str.charCodeAt(i) := 72
=> 72 & 0xF0 := 64, also 1001000 & 11110000 = 1000000 (hibit)
=> 64 >> 4 := 4, also 1000000 >> 4 = 100

also, da b in diesem Fall <= 9 ist, wird der character mit dem Wert b + 48 an das Ergebnis angehängt: 4+48 = 62 = '4' wobei die werte 48 bis 57 die Zahlen 0 bis 9 darstellen

=> str.charCodeAt(i) := 72
=> 72 & 0x0f := 8, also 1001000 & 00001111 = 1000 (lowbits)

nun wird also '8' angehängt und schon haben wir 'H' als '48' codiert

und so weiter und so fort

fals b mal größer 9 wird, wird der ascii wert zwischen 65 und 70 genohmen; wobei A-Z zwischen 65 und 90 liegt; (wenn man an dieser stelle kleine Buchstaben haben möchte, muss man nur 65 durch 97 ersetzen

an sich muss man jetzt nur gewährleisten, dass b nie größer als 15 wird; kann man das?
ja, natürlich; durch das rechts shiften (>>) und das Unden (&) bekommt man es immer nur mit vier-bit zahlen zu tun

vier bit zahlen sind definiert zwischen 0000 und 1111; also
maximal 0x0 bis 0xF also immer < 15
Netspider
 2004-06-09 19:58
#25728 #25728
User since
2003-09-25
49 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi,

als alternative (zahl->hex) kann man auch folgendes nehmen:

Code: (dl )
1
2
zahl=65535;
alert(zahl.toString(16));
perl -e "s;;Ronny Lindner;;m;(..).$;;$l=$1;s;n;;g;m;.{4}$;;$_=$l;$I=$&;m;^(.);;$_.='ts';$_.=$1;$_++;$_++;$_.=$I;print ucfirst;"
[E|B]
 2004-06-09 20:40
#25729 #25729
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@esskar

Woher wüsste ich denn, um wieviel Bits ich shiften muss, wenn ich so etwas schreiben will? Oder wie das genau geht? Bedarf das höherer Schulung?
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
esskar
 2004-06-09 21:40
#25730 #25730
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
es ist ja allgemein bekannt, dass 1byte meistens 8bit besprechen...

nehmern wir nochmal den Buchstaben 'H'

dezimal Wert: 72
binär Wert: 01001000
hex Wert: 48

man sieht nun direkt, dass 0100 in dezimal 4 und 1000 in dezimal 8 sind...

wie komm ich an diese Viererpäckchen? Mit Bit-Undung

Code: (dl )
1
2
3
4
   01001000
& 11110000 (0xF0)
----------
01000000 >> 4 = 00000100 (also die letzen 4 Bits weggeworfen)

jetzt hab ich genau die 4, die ich brauche

Code: (dl )
1
2
3
4
   01001000
& 00001111 (0x0F)
----------
00001000 (hier brauch ich nicht zu shiften, da ich schon die hinteren 4 bits habe)

jetzt hab ich genau die 8, die ich brauche!

okay?
[E|B]
 2004-06-09 22:04
#25731 #25731
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Ahh, ok. Jetzt kommt Licht in die Sache. Danke, esskar!
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
<< >> 10 Einträge, 1 Seite



View all threads created 2004-05-31 18:24.