如何从八位字节流的十六进制表示形式实例化ArrayBuffer?

时间:2015-04-09 17:50:23

标签: javascript

我有来自TCP连接(WebSocket)的二进制信息。这将以编码格式跟踪到控制台,如下所示:

53 54 41 52 54 45 44 3a 31 34 32 38 36 30 32 30 38 37 

我认为这是每个字节的十六进制编码。

该信息实际上是协议缓冲区信息。我想编写一个函数来使用我拥有的库对其进行解码。第一步是让我创建一种缓冲对象来封装二进制信息以供应给库。

我还不知道库的精确类型期望,但它需要某种二进制缓冲区。

协议缓冲区解码库API如下所示:

library.byteBufferToResponse(buffer);

如何从八位字节流的十六进制表示中实例化某种“二进制缓冲区”?

var octetStream = '34 36 10 04 1a 05 0a 01 30';
var arrayBuffer = new ArrayBuffer(); // How can I initialize this with the binary data?

2 个答案:

答案 0 :(得分:2)

ArrayBuffer是类型化数组的支持,所以:

var arrayBuffer = new Uint8Array(octetStream).buffer;

答案 1 :(得分:1)

您需要使用Typed Array来访问缓冲区。您可以直接将您拥有的数组文字放入其构造函数中,它将构造一个缓冲区或适当的大小。

  

body=53 54 41 52 54 45 44 3a 31 34 32 38 36 30 32 30 38 37 37 38 36类似,我将其解释为十六进制编码字节。

为此,您可以将TypedArray.from与地图功能结合使用:

var msg = "body=53 54 41 52 54 45 44 3a 31 34 32 38 36 30 32 30 38 37 37 38 36";
var arr = Uint8Array.from(msg.slice(5).split(" "), function(byte) {
    return parseInt(byte, 16);
});
var buffer = arr.buffer; // not sure you actually need this