ArrayBuffer 的 Binary 说明
ArrayBuffer's Binary clarification
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt8
只是想在这里澄清一些事情,当这篇文章说:
The setInt8() method stores a signed 8-bit integer (byte) value at the specified byte offset from the start of the DataView.<<
然后你执行这段代码
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
因为 256
超出了 8 位整数的范围,所以 dataview.setInt8(1,257)
不应该出现错误吗?我只是想确认缓冲区实际上是我上面列出的二进制数组...所以如果将 8 位整数转换为 16 位整数,这会有所不同...谢谢!
如果你试试这个:
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)
return 都不是错误,.setInt8(1,-1)
和 .setUint8(1,-1)
具有相同的效果。
此外,您还询问了 'with the highest number possible being 127?'。是的,如果您正在使用 getInt8()
读取缓冲区。使用 getUint8()
或 getInt16()
等读取它可能 return 高于 127 的值。与 set 函数不同,get 函数似乎(正确地)在签名方面表现不同。
从空缓冲区开始,如果执行:
dataview.setInt8(1,3);
dataview.setInt8(3,3);
缓冲区将包含:
00000000 00000011 00000000 11111101
您可以通过尝试验证这一点:
dataview.getInt32(0); // 196861 = 110000000011111101
负数在缓冲区
中通过Two's Complement表示
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/setInt8
只是想在这里澄清一些事情,当这篇文章说:
The setInt8() method stores a signed 8-bit integer (byte) value at the specified byte offset from the start of the DataView.<<
然后你执行这段代码
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
因为 256
超出了 8 位整数的范围,所以 dataview.setInt8(1,257)
不应该出现错误吗?我只是想确认缓冲区实际上是我上面列出的二进制数组...所以如果将 8 位整数转换为 16 位整数,这会有所不同...谢谢!
如果你试试这个:
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)
return 都不是错误,.setInt8(1,-1)
和 .setUint8(1,-1)
具有相同的效果。
此外,您还询问了 'with the highest number possible being 127?'。是的,如果您正在使用 getInt8()
读取缓冲区。使用 getUint8()
或 getInt16()
等读取它可能 return 高于 127 的值。与 set 函数不同,get 函数似乎(正确地)在签名方面表现不同。
从空缓冲区开始,如果执行:
dataview.setInt8(1,3);
dataview.setInt8(3,3);
缓冲区将包含:
00000000 00000011 00000000 11111101
您可以通过尝试验证这一点:
dataview.getInt32(0); // 196861 = 110000000011111101
负数在缓冲区
中通过Two's Complement表示