Forum: PC-Programmierung Frage zu SpiderMonkey / JS_ConvertArguments [C-Sprache]


von Jürgen W. (lovos)


Lesenswert?

Hallo,
ich übergebe einer selbtgeschriebenen JavaScript-Funktion ein String 
(eigentlich Byte-Array), welcher NICHT nullterminiert ist. D.h. er kann 
auch Null-Bytes im String enthalten.

z.zt. übergebe ich im JS-Code String und Länge
1
arr="1234\0005678";
2
own_func(arr,arr.length)
Im C-Code der Funktion habe ich dann die Länge des Arrays/Strings zur 
Verfügung, da ich ja strlen() nicht verwenden kann.
1
static JSBool own_func(JSContext *cx, JSObject *obj,
2
  uintN argc, jsval *argv, jsval *rval) {
3
const char *str;
4
jsdouble dbl;
5
int len;
6
if (!JS_ConvertArguments(cx, argc, argv, "sd",
7
  &str,&dbl)) return JS_FALSE;
8
len=(int)dbl

Mir gefällt die zusätzliche Längenangabe nicht.
Frage: Gibt es die Möglichkeit auf die Längenangabe im JS-Code zu 
verzichten und Länge des Arrays anders herzubekommen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jürgen W. schrieb:
> Mir gefällt die zusätzliche Längenangabe nicht.

Ist aber so.

Solange das ein Array ist, das, wie in Deinem Beispiel, auch Nullen 
enthalten kann, es also nicht den C-String-Konventionen genügt, geht 
es nur mit einer zusätzlichen Längenangabe.

Erst wenn das Array den C-String-Konventionen genügt, also mit einer 
Null terminiert ist, lässt sich auf die Längenangabe verzichten und die 
in C üblichen Stringverarbeitungsfunktionen verwenden -- hier also 
strlen.

von Jürgen W. (lovos)


Lesenswert?

Die Antwort war ja total schnell ...

> Ist aber so.

Tja, ich hätte gehofft, es gibt wie bei LUA eine Funktion, die mir die 
Länge des Strings-mit-Nullen angibt, z.B.
1
if (lua_type(L,-2)==LUA_TSTRING) {
2
      const char *str=lua_tostring(L,-1);
3
      int len=lua_strlen(L,-1);

von Jürgen W. (lovos)


Lesenswert?

Ich löse das Problem so, dass ich vor dem Byte-Array 4 zusätzliche Bytes 
einfüge, die die Länge angeben:

0-3: Länge
4-x: eigentlicher Inhalt

Leider sind die 8-Bit Strings bereits "obsolete", d.h. keine dauerhafte 
Lösung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.