ArrayBuffer的二进制澄清

时间:2015-04-19 17:40:08

标签: javascript binary arraybuffer

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt8

当这篇文章说:

时,我想在这里澄清一些事情
  

setInt8()方法在距DataView开头的指定字节偏移处存储带符号的8位整数(字节)值。<<

然后执行此代码

var buffer = new ArrayBuffer(8);
var dataview = new DataView(buffer);
dataview.setInt8(1, 3);
dataview.setInt8(3, -3);

缓冲区实际上是:

[
00000000,
00000011,
00000000,
10000011,
00000000,
00000000,
00000000,
00000000
]

最高可能是127

我想我已经用

证实了这一点
dataview.setInt8(1,128);
dataview.getInt8(1); // -127

但是......我很困惑为什么它会回复......

dataview.setInt8(1, 255);
dataview.getInt8(1); // -1

dataview.setInt8(1, 257);
dataview.getInt8(1); // 1

由于dataview.setInt8(1,257)超出了8位整数的范围,我不应该在256收到错误吗?我只是想确认缓冲区实际上是上面列出的二进制数组...所以如果将8位整数转换为16位整数,这会有所不同......谢谢!

1 个答案:

答案 0 :(得分:0)

如果您尝试这样做:

dataview.setInt8(1,1);
dataview.getInt16(1); // 256
dataview.setInt8(1,257);
dataview.getInt16(1); // 256

你可以确认setInt8只写入缓冲区的一个字节,即使给定的输入值超过8位也是如此。所以你在那里安全。

奇怪的是,.setInt8().setUint8()似乎是相同的功能(在Chrome上,我尝试过的唯一浏览器)。 .setInt8(1,255).setUint8(1,-1)都不会返回错误,.setInt8(1,-1).setUint8(1,-1)会产生相同的效果。

此外,你问过最高可能是127?'。是的,如果您正在使用getInt8()读取缓冲区。使用getUint8()getInt16()等读取它可能会返回高于127的值。与set函数不同,get函数在签名方面似乎(正确地)表现不同。

从空缓冲区开始,如果执行:

dataview.setInt8(1,3);
dataview.setInt8(3,3);

缓冲区将包含:

00000000 00000011 00000000 11111101

您可以尝试:

来验证这一点
dataview.getInt32(0); // 196861 = 110000000011111101

负数通过缓冲区中的Two's Complement表示