Naja, dann gäbe es Probleme mit Zeichen wie
æ¼¢å—
(wird hier nicht dargestellt -- siehe http://stackoverflow.com/a/21648161 das Japanische Zeichen)
Jetzt hab ich es hinbekommen. Nutze jetzt für mich die "Intel-Konvention" (https://de.wikipedia.org/wiki/Hexadezimalsystem) -- Format {hex}h
um verketten zu können.
Gibt allerdings einen "bug" beim letzten Test:
functions:
function strToHex(str, format, plholder){
/* (default hex-placeholder: %)
para example:
intel convention: str, "%h" [, "%"]
uri: str, "%{%}", "{%}" OR str, "%{plholder}", "{plholder}"
html: str, "#%" [, "%"]
xml: str, "&#x%" [, "%"]
unix: str, "0x%" [, "%"]
*/
for(var i = 0, hex, result = ""; i < str.length; i++){
hex = str.charCodeAt(i).toString(16);
if(typeof format === "undefined"){
result += ("00000"+hex).slice(-6);
}
else{
result += format.replace(typeof plholder === "undefined" ? "%" : plholder, hex);
}
}
return result
}
function hexToStr(hex, format, plholder){
/* (default hex-placeholder: %)
para example:
intel convention: hex, "%h" [, "%"]
uri: hex, "%{%}", "{%}" OR str, "%{plholder}", "{plholder}"
html: hex, "#%" [, "%"]
xml: hex, "&#x%" [, "%"]
unix: hex, "0x%" [, "%"]
*/
var tmp = [], prefix = "", suffix = "", hexes = [], regex;
if(typeof format === "undefined"){
regex = ".{1,6}";
}
else{
plholder = typeof plholder === "undefined" ? "%" : plholder;
tmp = format.split(plholder);
prefix = tmp[0]; // "" or "possibleprefix"
suffix = tmp[1]; // "" or "possiblesuffix"
regex = format.replace(plholder, "[0-9A-F]+");
// regex ^= "possibleprefix[A-Fa-f0-9]+possiblesuffix"
}
hexes = hex.match(new RegExp(regex, "ig")) || [];
for(i = 0, result = ""; i < hexes.length; i++){
if(prefix.length > 0){
hexes[i] = hexes[i].replace(prefix, "");
}
if(suffix.length > 0){
hexes[i] = hexes[i].replace(suffix, "");
}
result += String.fromCharCode(parseInt(hexes[i], 16));
}
return result;
}
Alles anzeigen
tests:
var str = "abc-#*´^?æ¼¢å—";
// TESTS //
console.log("str:\t" + str);
var tests = [];
tests["default"] = [undefined, undefined];
tests["intel convention"] = ["%h", undefined];
tests["uri"] = ["%{%}", "{%}"];
tests["html"] = ["#%", undefined];
tests["xml"] = ["&#x%", undefined];
tests["unix"] = ["0x%", undefined];
for(var key in tests){
format = tests[key][0], placeholder = tests[key][1];
hex = strToHex(str, format, placeholder),
back = hexToStr(hex, format, placeholder);
console.log("\ntest: \t" + key);
console.log("format \t" + format);
console.log("plholder\t" + placeholder);
console.log("hex \t" + hex);
console.log("back\t" + back);
console.log("check\t" + (str === back));
}
Alles anzeigen
output:
str: abc-#*´^?æ¼¢å—
test: default
format undefined
plholder undefined
hex 00006100006200006300002d00002300002a0000b400005e00003f006f22005b57
back abc-#*´^?æ¼¢å—
check true
test: intel convention
format %h
plholder undefined
hex 61h62h63h2dh23h2ahb4h5eh3fh6f22h5b57h
back abc-#*´^?æ¼¢å—
check true
test: uri
format %{%}
plholder {%}
hex %61%62%63%2d%23%2a%b4%5e%3f%6f22%5b57
back abc-#*´^?æ¼¢å—
check true
test: html
format #%
plholder undefined
hex #61#62#63#2d#23#2a#b4#5e#3f#6f22#5b57
back abc-#*´^?æ¼¢å—
check true
test: xml
format &#x%
plholder undefined
hex abc-#*´^?漢字
back abc-#*´^?æ¼¢å—
check true
test: unix
format 0x%
plholder undefined
hex 0x610x620x630x2d0x230x2a0xb40x5e0x3f0x6f220x5b57
back ØØ°È°à€Ï°å—
check false
Alles anzeigen
Das Problem beim letzen Test:
hex str: 0x610x620x630x2d0x230x2a0xb40x5e0x3f0x6f220x5b57
pattern: 0x[0-9A-F]+
result: 0x610 0x630 0x230 0xb40 0x3f0 0x5b57
expected: 0x61 0x62 0x63 0x2d 0x23 0x2a 0xb4 0x5e 0x3f 0x6f22 0x5b57
Ich bekomme per regex die 0 vom Prefix x0 hinten "angehängt".
Eigtl logisch, denn die 0 zählt unter 0-9.
Bekommt man ds mit regex hingebogen?