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

Javascript 如何从八位字节流的十六进制表示实例化ArrayBuffer?,javascript,Javascript,我通过TCP连接(WebSocket)获得二进制信息。这以编码格式跟踪到控制台,如下所示: 53 54 41 52 54 45 44 3a 31 34 32 38 36 30 32 30 38 37 我想这是每个字节的十六进制编码 该信息实际上是协议缓冲区信息。我想写一个函数来解码它使用我有一个库。对我来说,第一步是创建某种缓冲区对象来封装二进制信息,以便提供给库 我还不知道库的确切类型期望值,但它需要某种二进制缓冲区 协议缓冲区解码库API如下所示: library.byteBufferT

我通过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?

ArrayBuffer
s是类型化数组的备份,因此:

var arrayBuffer = new Uint8Array(octetStream).buffer;
您将需要使用访问缓冲区。您可以直接将您拥有的数组文本放入其构造函数中,它将构造一个缓冲区或适当大小的缓冲区

比如
body=535441525445443a3134323836303837373733836
,我将其解释为十六进制编码字节

为此,您可以与映射函数一起使用:

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

您问题中的“八位字节流”只是一个普通的JavaScript数字数组。这是实际情况吗,还是你真的有某种二进制缓冲区(不知怎么的)?接下来,你需要一个ArrayBuffer(它本身基本上是无用的)还是一个类型化的数组?在这种情况下:最好描述您试图解决的实际问题(例如,“我有一个通过XHR加载的文件,并且希望以
uint8
s的形式访问其数据”),以防止将此转换为通过WebSocket连接的I have binary数据。作为第一步,我希望能够使用trace函数将二进制流的表示形式显示在控制台上。控制台表示类似于body=53 54 41 52 54 45 44 3a 31 34 32 38 36 32 30 38 37 38,我将其解释为十六进制编码字节。这是在浏览器中。如果您通过web套接字接收数据,它不是已经是ArrayBuffer了吗?@Pointy可能是这样,但在这种情况下,我想使用打印到控制台的值作为十六进制编码的二进制八位字节流。
Uint8Array.from
未定义。这是浏览器吗?我使用的是Chrome41.0.2。我也尝试过Firefox 27.OK,所以这种方法只在Firefox 38+上受支持;buffer.set(msg.split(“”).map(function(i){return parseInt(i,16);}))@BenAston:您需要执行
新的Uint8Array(msg.split(“”).length)
,但是是的,
八进制流应该是什么形式?一组UINT8?你能告诉我怎么做吗
Uint8Array.from
对我来说是未定义的。@贝纳斯顿:大约30秒后,我将其更改为
newuint8array()
;不知道你是怎么看到的。无论如何,是的,一个字节数组。