Not sure if you still need help with this, but ... expanding on what Ben 
said:

Node Buffers are Uint8Arrays (ArrayBufferViews) in version 4.x and later 
only.

Small node Buffers ([currently] <4096 bytes) use a shared buffer as a 
backing store, which is why you see a greater byteLength. You need to 
observe the byteOffset and byteLength to find the section of the shared 
buffer that belongs to your buffer.

If you want something for Buffers compatible going back to node 0.10, use 
Buffer::Data() from node_buffer.h, which takes care of the byteOffset for 
you:

char* Data(Local<Value> val) {
  CHECK(val->IsUint8Array());
  Local<Uint8Array> ui = val.As<Uint8Array>();
  ArrayBuffer::Contents ab_c = ui->Buffer()->GetContents();
  return static_cast<char*>(ab_c.Data()) + ui->ByteOffset();
}

If you really want to handle them as Uint8Arrays, there's an example using 
nan (native abstractions for node) to access typed array contents here:
https://github.com/Automattic/node-canvas/blob/a3492e3c3355b13433e1a3ddd5197f8bfa90f26c/src/ImageData.cc#L111
And an example without the nan macro here:
https://github.com/Automattic/node-canvas/blob/2884267de4a45cbbb6dfa717903d054cf8a7ab94/src/ImageData.cc#L107-L111
But using node's exported function should be preferable if you're actually 
consuming Buffers.

-Zach

On Monday, July 4, 2016 at 3:00:08 AM UTC-7, Elia Mazzuoli wrote:
>
> Hi all, I'm trying to access data inside an ArrayBufferView. This is my 
> simple javascript code:
>
> const myAddon = require('addon location');
>
> const myObj = myAddon.MyObj();
>
> const data = Buffer.from('test');
> myObj = doSomething(data);
>
> After that in my c++ I have this:
>
> void MyObj::doSomething(const v8::FunctionCallbackInfo<v8::Value> &args) 
> {) {
>
>     Local<v8::ArrayBufferView> dataBufferView = 
> Local<v8::ArrayBufferView>::Cast(args[1]);
>
>     std::cout << "Lenght on dataBufferView: " << dataBufferView->ByteLength() 
> << std::endl;
>
>     std::cout << "Byte offset on dataBufferView: " << 
> dataBufferView->ByteOffset() << std::endl;
>          
>      Local<ArrayBuffer> dataBuffer = dataBufferView->Buffer();
>
>      std::cout << "Lenght dataBuffer: " << dataBuffer->ByteLength() << 
> std::endl;
>
>      ArrayBuffer::Contents dataContent = dataBuffer->Externalize();
>
>
>      uint8_t* startData = static_cast<uint8_t*>(dataContent.Data());
>
>      std::cout << "Content of " <<dataContent.ByteLength() << " from js: ";
>
>      for(unsigned int i = 0; i < dataContent->ByteLength(); i++) {
>
>         std::cout << *(startData + i);
>
>      }
>
>      std::cout << std::endl;
>
>
> }
>
>
> What is strange in this simple code is that dataBuffer->ByteLength() is 
> 8192 and if I print out the data content what I see is my full javascript 
> code and some other binary data.
>
> So.. what is the right way to access data?
>

-- 
-- 
v8-users mailing list
v8-users@googlegroups.com
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to