我在javascript中有以下对象:
var arr = {
'id': 23, // uint32
'login': 'some string' // char[16]
};
我想将此对象转换为二进制数据(数组缓冲区)并将其发送到服务器。我想出了类似的东西:
var buffer = new ArrayBuffer(36);
var idView = new Int32Array(buffer, 0, 1);
idView[0] = 23321;
var loginView = new Int16Array(buffer, 4, 16);
loginView = "Random username";
所以我在idView
变量中有4个字节(1个int32),在loginView
变量中有32个字节(16个int16)。
我想通过ajax作为二进制数据发送它,但当我检查服务器端字节时,我得到了:
[25 91 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
这是完全错误的。怎么了?
答案 0 :(得分:0)
这是一个非常正确的输出。
自Node.js is basically a Uint8Array中的Buffer
起,您可以使用Uint8Array
作为调试视图:
var debugView = new Uint8Array(buffer);
console.log(debugView); // [25, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
您的代码中有一行符合您的预期:
loginView = "Random username";
它只是将旧的String
分配给loginView
,而不是用整数填充缓冲区。
您可能想要做的是:
"Random username".split('').forEach((x, i) => loginView[i] = x.charCodeAt(0));
显然无法将字符分配给类型化数组。