2 つの引数 (buffer、len) を持つ JavaScript 関数があります。ここで、buffer は長さ「len」のエンコードされたデータの配列です。私の関数は問題なく 2 つの値を返します。しかし、実際のデータを JavaScript 文字列に読み込む方法がわかりませんでした。データがUTF-8ではないため、readStringは機能しません。
同じ長さと同じバイトサイズの ArrayBuffer にデータ(私の場合は「バッファ」)をフィードできるかどうか疑問に思っていました
2 つの引数 (buffer、len) を持つ JavaScript 関数があります。ここで、buffer は長さ「len」のエンコードされたデータの配列です。私の関数は問題なく 2 つの値を返します。しかし、実際のデータを JavaScript 文字列に読み込む方法がわかりませんでした。データがUTF-8ではないため、readStringは機能しません。
同じ長さと同じバイトサイズの ArrayBuffer にデータ(私の場合は「バッファ」)をフィードできるかどうか疑問に思っていました
あなたの関数は 2 つの値を返しますか? c関数がデータへのポインタとintを長さとして返すということですか?
あなたのc関数が次のように宣言されているとします
xxxx.declare('function_name',
ctypes.default_abi,
ctypes.int, //the return value, suppose as length
ctypes.uint8_t.ptr.ptr);
var ct_ptr=new ctypes.uint8_t.ptr();
var ct_len=function_name(ct_ptr.address());
ct_ptr.contents is the 1st element of the array
タイプ uint8_t の ctype ポインターから JavaScript のデータにアクセスする方法は、 ct_ptr[1].contents が 2 番目の要素にアクセスすることを示唆しています。試してみたところ、[1] は受け入れられないことがわかりました。次にキャストしてみました
var ct_array=ctypes.cast(ct_ptr, ctypes.uint8_t.array(4));
//then ct_array[0 ... 3] is accessible.
配列サイズが 4 以下の場合は成功しました。ただし、ポイントの値をバイト配列に変換します。正しい方法は次のとおりです。
var ct_arrayptr=ctypes.cast(ct_ptr, ctypes.uint8_t.array(ct_len.value).ptr);
var ct_array=ct_arrayptr.contents;
//now ct_array[0 ... ct_len.value-1] is accessible.