• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Problem mit zahlen in Uint8Array

aber auch kein valider ucs string
Natürlich ist das ein valider UCS String. UCS sagt ja auch nur, dass du 2 Bytes für jedes Zeichen hast. Da gibt es sonst keine Beschränkungen.
daß jeder müll im string vorkommen kann
Genau - das ist UCS.

in einen string wandelt und wieder zurück in ein uint8 array
Warum sollte ich das tun wollen? Das ist überhaupt gar nicht die Fragestellung. Die crypto-Sachen im Browser erwarten einen ArrayBuffer als Input und keinen String (https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt). Deswegen muss man da vorher den String in einen Uint8Array umwandeln. Wenn dann beim Entschlüsseln keine validen UTF-8 Zeichen rauskommen, ist entweder der Schlüssel nicht korrekt oder es wurde was falsch übertragen.

Für mich sieht also der Ablauf so aus: Klartext (String) -> Klartext (UTF-8 Uint8Array) -> Verschlüsselt (Uint8Array) -> Verschlüsselt (base64 String) -> Server oder was auch immer
Die Entschlüsselung ist dann in die andere Richtung. Für den Schritt Uint8Array zu base84 bietet der Browser meines Wissens nach nichts an, aber das ist ja auch kein Hexenwerk. Der Rest ist mit den erwähntetn Bordmitteln machbar.
 
Natürlich ist das ein valider UCS String. UCS sagt ja auch nur, dass du 2 Bytes für jedes Zeichen hast. Da gibt es sonst keine Beschränkungen.
bis auf die, dass nur gültige unicode zeichen gültig sind

Warum sollte ich das tun wollen? Das ist überhaupt gar nicht die Fragestellung.
die aufgabe ist eine funktion uint8-array zu string zu implementieren und vice versa. wenn du behauptest das geht mit textencoder, dann musst du das nicht tun wollen, aber bis du mir das gegenteil beweist, behaupte ich das geht nicht(in einer sinnvollen art und weise)

Die crypto-Sachen im Browser erwarten einen ArrayBuffer als Input und keinen String (https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt). Deswegen muss man da vorher den String in einen Uint8Array umwandeln. Wenn dann beim Entschlüsseln keine validen UTF-8 Zeichen rauskommen, ist entweder der Schlüssel nicht korrekt oder es wurde was falsch übertragen.
es geht hier aber noch überhaupt nicht um die entschlüsselung, sondern um den verschlüsselten uint8 puffer

Für mich sieht also der Ablauf so aus: Klartext (String) -> Klartext (UTF-8 Uint8Array) -> Verschlüsselt (Uint8Array) -> Verschlüsselt (base64 String) -> Server oder was auch immer
Die Entschlüsselung ist dann in die andere Richtung. Für den Schritt Uint8Array zu base84 bietet der Browser meines Wissens nach nichts an, aber das ist ja auch kein Hexenwerk. Der Rest ist mit den erwähntetn Bordmitteln machbar.
dass das vernümpftigste wäre die wandlung des uint8 arrays in einen base64 string selbst zu schreiben oder eine fertige zu nehmen musst du mir nicht erzählen, wenn er das machen wöllte wäre aber der ganze thread hier überflüssig da er dann nur eine uint8-array zu base64 bräuchte.

was er aber will ist ein uint8 array in einen string zu wandeln und diesen dann mit btoa in einen base64 string zu wandeln. und das ganze dann wieder rückwärts.

ansonsten müssten wir hier nicht über textencoder reden. und ein uint8array bekommst du nunmal nicht in einen string und wieder zurück in ein uint8 array wie von dir behauptet wenn man mit utf8 arbeitet.
 
bis auf die, dass nur gültige unicode zeichen gültig sind
Die Surrugates sind gültige Unicode Zeichen - aber diese Diskussion ist müßig. Fakt ist, dass man in ein JS-String beliebige 16-Bit "Zeichen" speichern kann.
die aufgabe ist eine funktion uint8-array zu string zu implementieren und vice versa. wenn du behauptest das geht mit textencoder, dann musst du das nicht tun wollen, aber bis du mir das gegenteil beweist, behaupte ich das geht nicht(in einer sinnvollen art und weise)
Geht schon mit TextEncoder und TextDecoder:
Code:
var d = new TextDecoder("ASCII");
console.log(d.decode(new Uint8Array([25, 235, 161, 121, 221, 61, 132, 15, 161, 17])));
- aber für einen beliebigen ArrayBuffer darf man natürlich nicht UTF-8 verwenden. Man muss schon immer wissen, was für Daten man da gerade betrachtet.

sondern um den verschlüsselten uint8 puffer
Das hatte ich anders verstanden... ich habe die Frage so verstanden, dass es um die ersten Schritte geht.

musst du mir nicht erzählen
Gut. Dann sind wir da ja einer Meinung.

was er aber will ist ein uint8 array in einen string zu wandeln und diesen dann mit btoa in einen base64 string zu wandeln. und das ganze dann wieder rückwärts.
Was er will, kann er nur selbst beantworten. Ich kann diesen Wunsch in der Fragestellung nicht finden.

ansonsten müssten wir hier nicht über textencoder reden. und ein uint8array bekommst du nunmal nicht in einen string und wieder zurück in ein uint8 array wie von dir behauptet wenn man mit utf8 arbeitet.
Klar - einen beliebigen Uint8Array kann man nicht als UTF-8 interpretieren. Aber dann brauche ich UTF-8 auch gar nicht, sondern kann direkt mit ASCII arbeiten (sind ja nur 8 bit...).
 
Die Surrugates sind gültige Unicode Zeichen
sind sie nicht, warum wiedersprichst du dir denn jetzt selbst?
Ds sagt uns, dass es kein UTF-16 sein kann, da diese Zeichen alleine kein valider UTF-16 String ist.

Geht schon mit TextEncoder und TextDecoder:
Code:
var d = new TextDecoder("ASCII");
console.log(d.decode(new Uint8Array([25, 235, 161, 121, 221, 61, 132, 15, 161, 17])));
nein, geht nicht, da du den teil der nicht geht - der rückweg, über den wir ja reden - wohlweislich weggelassen hast

aber für einen beliebigen ArrayBuffer darf man natürlich nicht UTF-8 verwenden.
das sagte ich ja

Man muss schon immer wissen, was für Daten man da gerade betrachtet.
wir betrachten ein uint8-array

Das hatte ich anders verstanden... ich habe die Frage so verstanden, dass es um die ersten Schritte geht.
http://forum.jswelt.de/javascript/6...rraybuffer-uint8array-textencoder-base64.html

Klar - einen beliebigen Uint8Array kann man nicht als UTF-8 interpretieren. Aber dann brauche ich UTF-8 auch gar nicht, sondern kann direkt mit ASCII arbeiten (sind ja nur 8 bit...).
was aber mit textencoder nicht geht, jetzt sind wir wieder am anfang
 
sind sie nicht, warum wiedersprichst du dir denn jetzt selbst?
Unicode hat erst mal nichts mit UTF-16 oder UTF-8 zu tun.

Tatächlich - das Teil unterstützt nichts anderes als UTF-8. Dann funktioniert das da tatsächlich nicht und man muss den Rückweg etwas komplizierter machen:
Code:
var d = new TextDecoder();
console.log(
	[].reduce.call(
		d.decode(new Uint8Array([25, 235, 161, 121, 221, 61, 132, 15, 161, 17])),
		function(arr, char, i){
			arr[i] = char.charCodeAt(0);
			return arr;
		},
		new Uint8Array(10)
	)
);
 
Zurück
Oben