JavaScript: Zahlen und Zeichen

Gast #3497796
Lesenswert?
• ▲
▼
Von einem AVR-NETIO bekomme ich zehn 16-Bit Werte, die weiterverarbeitet 
werden sollen. Im Beispiel wird ein String mit 20 Nullen gefüllt, in 
2-Byte Werte aufgeteilt und ausgegeben.

Ausgabe: jeweils NaN.

Wie komme ich an die Zahlen heran?
1
script type="text/javascript">
2
  var Eingabe = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
3
  var i;
4
  var x;
5
  
6
  document.write (Eingabe.length, ":")
7
  
8
  for (i = 0; i < 20; i += 2)
9
    {
10
     x = Number(Eingabe.substr(i, 2));
11
     document.write (x, " ");   
12
    }
13
  
14
</script>
#3497816
Lesenswert?
• ▲
▼
KalterKaffee schrieb:
> Von einem AVR-NETIO bekomme ich zehn 16-Bit Werte

Was jetzt?

Kriegst du 10 Stück 16-Bit Werte (also pro Wert 2 Bytes), oder kriegst 
du einen String, in dem 10 Stück Zahlen in Textform dargestellt sind?

Wenn ersteres: Dann kannst du nicht mit String-verarbeitung da drann 
gehen.
Wenn letzteres, dann sieht dein String aber anders aus. Zb so
"23,587,25723,0,38,56,98,345,98,12"

> Wie komme ich an die Zahlen heran?

Die Frage, die es zuvor zu beantworten gilt lautet: Was kriegst du 
eigentlich wirklich? Bytes oder einen String?
Gast #3497846
Lesenswert?
• ▲
▼
Es sind 10 x 16-Bit (10 x 2 Bytes) zu einem String zusammengefasst (20 
Bytes). Diese werden in einem Rutsch vom NETIO gesendet und landen im 
Browser (JavaScript) in einem String der Länge 20. Diesen String möchte 
ich aufteilen in 16-Bit (2 Bytes) Portionen, um mit denen weiter 
zurechnen.
#3497858
Lesenswert?
• ▲
▼
KalterKaffe schrieb:
> Es sind 10 x 16-Bit (10 x 2 Bytes) zu einem String zusammengefasst (20
> Bytes).

Du kannst das gerne 'String' nennen. Dann stehst du aber alleine auf 
weiter Flur mit deiner Bezeichnung. Und du wirst in die Irre geführt, 
indem du fälschlicherweise annimmst, du könntest da mit Stringfunktionen 
wie zb substr irgendwas ausrichten. Denn was du da hast, gilt für den 
Rest der Welt nicht als 'String'.
#3497888
Lesenswert?
• ▲
▼
Du kannst versuchen, den String einfach als ein Array aufzufassen, die 
Bytes einzeln zu holen und dann selbst zu einem 16 Bit Wert 
zusammenzusetzen.
So würde ich das probieren, nachdem ich mich vergewissert habe, dass die 
0-Bytes im 'String' mir da nicht einen Strich durch die Rechnung machen. 
Alles hängt davon ab, wie eigentlich intern Javascript seine Strings 
organisiert um die Länge festzustellen:
* auf C Art. Dann sieht es schlecht aus. Denn die besteht darin, dass 
ein String genau dann zu Ende ist, wenn das erste \0 Byte in den Zeichen 
auftaucht
* auf Pascal Art. Dann könntest du Glück haben. Denn dann weiß ein 
String unabhängig vom Inhalt, wie lang er ist. Die Länge wird extra 
gespeichert.
Gast #3498076
Lesenswert?
• ▲
▼
Falls jemand ein ähnliches Problem hat: so geht es.
1
<html><head><title>Test</title></head><body>
2

3
<script type="text/javascript">
4
  var Eingabe = "\n\0\r\0";    // Zwei 16-Bit Werte (High-, Lowbyte)
5
  var i;
6
  var x;
7
 
8
  for (i = 0; i < Eingabe.length; i += 2 )
9
    {
10
   x = Eingabe.charCodeAt(i) * 256 + Eingabe.charCodeAt(i + 1);
11
   document.write (i/2 + 1, ". 16-Bit Wert: ", x, "<br>");   
12
  }
13
  
14
</script>
15

16
</body></html>


Ausgabe:
1
1. 16-Bit Wert: 2560
2
2. 16-Bit Wert: 3328

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.